я сталкиваюсь с ошибкой, постоянно взаимодействующей с сервером в приложении для Android

#android

#Android

Вопрос:

я создал приложение, которое работает хорошо, которое постоянно отправляет на сервер пользователя lat long, а также некоторые другие взаимодействия с сервером (например, изображение профиля, имя, список друзей и все, что отображается с сервера). но проблема в том, что когда приложение находится в фоновом режиме / пользователь совершает телефонный звонок / пользователь использует другие приложения, мои приложения теряют соединение, и пользователь выходит из служб, извлекаемых с сервера (все службы зависят от идентификатора пользователя, который пользователь получает при входе в систему). я пытаюсь решить эту проблему, как будто мое приложение всегда будет в порядке и будет взаимодействовать с его серверной активностью без каких-либо ошибок или прерываний, например, приложение facebook. как установить сетевое подключение и управлять им, которое будет вести себя как приложение facebook или WhatsApp. проверьте изображение. первый — это когда приложение хорошо взаимодействует (с именем профиля и рисунком), а второй — когда ошибка (без имени профиля и рисунком), например.

мой класс asyncTaskClass:

 public class GetPostAsyncTaskWithInterface extends AsyncTask<String, Void, String> {

    public AsyncResult asyncResu<
//    HttpURLConnection httpURLConnection;

    ProgressDialog progressDialog;
    private final String baseUrl = UserInfo.getSiteUrl();

    public Context context=null;


    GetPostAsyncTaskWithInterface(Context context,AsyncResult asyncResult) {

        this.context=context;
        this.asyncResult= asyncResu<
    }

    @Override
    protected void onPreExecute() {
        //Toast.makeText(context,"Loading..",Toast.LENGTH_SHORT).show();
        progressDialog=new ProgressDialog(context);
        progressDialog.show();

    }

    @Override
    protected String doInBackground(String... args) {

        try {
            // setting the URL
            URL url = new URL(baseUrl args[1]);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

            // setting the method type
            httpURLConnection.setRequestMethod(args[0]);
//                httpURLConnection.setChunkedStreamingMode(0);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setDoOutput(true);
            OutputStream outputStream = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));

            Log.v("Url", args[2]);
            // setting the identification key name with query params
            bufferedWriter.write(args[2]);
            bufferedWriter.flush();
            bufferedWriter.close();

            Log.v("GetPostA", url.toString());

            httpURLConnection.setReadTimeout(10*1000);
            httpURLConnection.setConnectTimeout(15000 );

            httpURLConnection.connect();
            int getPostStatus = httpURLConnection.getResponseCode();

            Log.v("GetPostSts", String.valueOf(getPostStatus));


            String line = "";
            String res = "";
//                if(getPostStatus == 200){

            // prepare the output buffer
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

            while ((line = bufferedReader.readLine()) != null) {

                res  = line;

            }

            inputStream.close();

//                }

            httpURLConnection.disconnect();

//                Log.v("ResD", res.toString());
            return res.toString();

        } catch (MalformedURLException e) {

            e.printStackTrace();
            Log.v("GetPostCatchMal",e.toString());

        } catch (IOException e) {

            e.printStackTrace();
            Log.v("GetPostCatchIOE", e.toString());

        }

        return null;

    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }


    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        if(progressDialog.isShowing()){
            try{
                progressDialog.dismiss();
            }catch (Exception e){

            }
        }
        if(result!=null) {
            asyncResult.asyncResult(result);
        }

    }

}
  

и мой класс активности похож:

       @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_navigation_drawer);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        context = NavigationDrawerActivity.this;

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        View hView = navigationView.getHeaderView(0);


        ownProfilePic = (ImageView) hView.findViewById(R.id.ownImageShowDrawerHeaderIvId_navigationDrawer);
        ownNameShow = (TextView) hView.findViewById(R.id.showUserNameTvId_navigationDrawer);

        /******************************   own profile name and image show **************************  */

        ownNameShow.setText(UserInfo.getOwnProfileName());
//        new ImageDownloaderTask(ownProfilePic).execute(UserInfo.ownProfilePicUrl);
        Picasso.with(context).load(UserInfo.getOwnProfilePicUrl()).resize(100,100).placeholder(R.drawable.profile_show).error(R.drawable.profile_show).transform(new CircleTransform()).into(ownProfilePic);

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;
        }
        this.lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        Criteria criteria=new Criteria();
        provider =lm.getBestProvider(criteria,false);
        location = this.lm.getLastKnownLocation(provider);
        this.locationListener = new NavigationDrawerActivity();
        this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 5, locationListener);


        if (location != null) {
            setUpMapIfNeeded(location);
            updateUserLatLong(location);

        }
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.

        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).addApi(LocationServices.API).build();

        //route
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
    // option menu.......................option menu,.,
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.navigation_drawer_option_menu, menu);
        return true;
    }


    @Override
    protected void onResume() {
        super.onResume();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;

        }
        Location location = this.lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location != null) {
            setUpMapIfNeeded(location);
        }

    }


    @Override
    public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;

        mMap.setMyLocationEnabled(true);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            return;
        }
        Location location = this.lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        Log.v("DangerNotification","locN M" location);
        if (location != null) {
            setUpMapIfNeeded(location);

            UserInfo.setLat(location.getLatitude());
            UserInfo.setLng(location.getLongitude());
            UserInfo.setLocation(location);
        }
        //setUpMapIfNeeded(location);

        mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {

                Intent intent = new Intent(context, Live_MapActivity.class);
                intent.putExtra("Driver", "anyFriend");

                UserInfo.setFriendsId(friendIds.optString(marker.getId()));
                startActivity(intent);

                Toast.makeText(context, "You tracking "   marker.getTitle(), Toast.LENGTH_LONG).show();

            }
        });
    }


    @Override
    public void onLocationChanged(Location location) {

        Log.v("DangerNotification", "locN "   location);

        if (location != null amp;amp; SharedPreference.getDefaults("ownUserId", context) != "0") {

            updateUserLatLong(location);
            //setUpMapIfNeeded(location);
            float speed = location.getSpeed();
            UserInfo.setSpeed(speed);

            UserInfo.setLat(location.getLatitude());
            UserInfo.setLng(location.getLongitude());
            UserInfo.setLocation(location);
        }
        userPosition = new LatLng(location.getLatitude(),
                location.getLongitude());

        if (mMap != null) {
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userPosition,
                    12));
            mMap.setMapType(UserInfo.getMapType());
        }
    }


    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {
        boolean gps_enabled = false;
        LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }
        if (gps_enabled) {
            Toast.makeText(context, "Gps enabled", Toast.LENGTH_LONG).show();

        }
    }

    @Override
    public void onProviderDisabled(String provider) {

          /* *********************************************  Gps checking **********************************************************   */

        boolean gps_enabled = false;
        LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }
        if (!gps_enabled) {

            Toast.makeText(context, "Gps Disable", Toast.LENGTH_LONG).show();

        }

            /* ************************************************************************************************************ */

    }


    private void setUpMapIfNeeded(Location location) {

        //updateUserLatLong(location);


        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;
        }

//        Criteria criteria = new Criteria();
//        criteria.setAccuracy(Criteria.ACCURACY_COARSE);

        LatLng userPosition = new LatLng(location.getLatitude(),
                location.getLongitude());

        if (mMap != null) {
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userPosition,
                    UserInfo.getZoomLevel()));

            mMap.setMapType(UserInfo.getMapType());

            userFriendsPos();

        }
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

            mMap.setMyLocationEnabled(true);
        }
    }


    @Override
    public void onStart() {
        super.onStart();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client.connect();
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Maps Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app deep link URI is correct.
                Uri.parse("android-app://com.tracker.systechdigital.realtimetrackingandmonitoring/http/host/path")
        );
        AppIndex.AppIndexApi.start(client, viewAction);
    }


    @Override
    public void onStop() {
        super.onStop();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Maps Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,

                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.

                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app deep link URI is correct.
                Uri.parse("android-app://com.tracker.systechdigital.realtimetrackingandmonitoring/http/host/path")
        );
        AppIndex.AppIndexApi.end(client, viewAction);
        client.disconnect();
    }




    @Override
    public void onConnected(Bundle bundle) {


        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        location = LocationServices.FusedLocationApi.getLastLocation(
                client);


    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void asyncResult(String result) {

    }



    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
    }

    @Override
    protected void onRestart() {
        super.onRestart();

        ownNameShow.setText(UserInfo.getOwnProfileName());
//        new ImageDownloaderTask(ownProfilePic).execute(UserInfo.ownProfilePicUrl);
        Picasso.with(context).load(UserInfo.getOwnProfilePicUrl()).resize(100,100).placeholder(R.drawable.profile_show).error(R.drawable.profile_show).transform(new CircleTransform()).into(ownProfilePic);

        if (location != null) {
            setUpMapIfNeeded(location);
            updateUserLatLong(location);

        }
    }


}
  

пожалуйста, нужна помощь.
введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

AsyncTasks не были предназначены для этого. В основном они предназначены для задач, которые занимают одну или две секунды. Они также могут привести к множеству проблем. Например, в вашем примере кода вы обновляете пользовательский интерфейс в onPostExecute, это может привести к NullPointerExceptions, утечкам памяти для вашей активности. Поэтому старайтесь избегать этого.

Я бы посоветовал вам использовать фоновую службу

Сервисы — это компоненты, которые продолжают работать в фоновом режиме и имеют лучшую производительность, что очень полезно для вашего случая.

Вы также можете посмотреть руководства по производительности Google Android здесь

Комментарии:

1. Сухайб Гитуни, не могли бы вы интегрировать приведенный выше код в сервис. я не могу этого сделать, я думаю