Android-телефон завис из-за постоянного обновления местоположения - PullRequest
0 голосов
/ 26 сентября 2018

Я занимаюсь разработкой приложения для Android.В моем приложении мне нужно постоянное обновление местоположения, и я должен сохранить эти данные в документах пожарного депо.Все работает нормально.Я получаю обновления местоположения постоянно и храню в пожарном депо.Но проблема в том, что мой телефон с Android зависает через 5 минут, когда я открывал свое приложение.Ниже мой код относительно обновлений местоположения.

LocationManager locmngr; // Location manager declaration

locationUpdate(); // Initializing the method in onCreate()

public void locationUpdate()
    {
        locmngr = (LocationManager) getSystemService(LOCATION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, 12);
            return;
        }

        boolean gps_enabled = false;
        boolean network_enabled = false;

        try {
            gps_enabled = locmngr.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
            Toast.makeText(TabsActivity.this, ""+ex, Toast.LENGTH_SHORT).show();
        }

        try {
            network_enabled = locmngr.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
            Toast.makeText(TabsActivity.this, ""+ex, Toast.LENGTH_SHORT).show();
        }

        if (!gps_enabled && !network_enabled) {
            // notify user
            AlertDialog.Builder dialog = new AlertDialog.Builder(this);
            dialog.setMessage("GPS network not enabled");
            dialog.setPositiveButton("Open Location Settings", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                    // TODO Auto-generated method stub
                    Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivity(myIntent);
                    //get gps
                }
            });
            dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                    // TODO Auto-generated method stub

                }
            });
            dialog.show();
        }

        try {
            locmngr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 7, 30, new LocationListener() {
                @Override
                public void onLocationChanged(final Location location) {

                    // Add a marker at your current location and move the camera
                    //Log.e("location", location.toString());

                    if(!user_id.isEmpty()){

                        // code to write lat longs into firestore
                    }

                }

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

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {
                    ActivityCompat.requestPermissions(TabsActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 12);
                }
            });
        } catch (Exception ex) {
            Toast.makeText(TabsActivity.this, ""+ex, Toast.LENGTH_SHORT).show();
        }
    }

    private final Runnable m_Runnable = new Runnable()
    {
        public void run()

        {
            try {

                locationUpdate();
                TabsActivity.this.mHandler.postDelayed(m_Runnable, 1000);

            }
            catch (Exception ex)
            {
                Toast.makeText(TabsActivity.this, ""+ex, Toast.LENGTH_SHORT).show();
            }
        }

    };

Мне нужно обновление местоположения каждую секунду.Что мне для этого нужно сделать (телефон завис).Пожалуйста, предложите мне любые другие возможности.Заранее спасибо.

1 Ответ

0 голосов
/ 26 сентября 2018

Ваш m_Runnable публикует себя для запуска каждую секунду.Каждый раз, когда он запускается, он вызывает locationUpdate(), который регистрирует новый LocationListener.Через пять минут у вас будет 300 слушателей, обрабатывающих каждое обновление.Вероятно, поэтому ваше приложение застревает!

Вам не нужно регистрировать нового слушателя каждый раз, когда вы хотите получать обновление местоположения.Просто зарегистрируйте его один раз в методе жизненного цикла установки активности.Не забудьте отменить регистрацию в соответствующем методе жизненного цикла.Вы, вероятно, должны использовать onStart / onStop, а не onCreate / onDestroy.Если вам нужно получать обновления, когда приложение находится в фоновом режиме, слушатель должен принадлежать к Service.

...