Сервис Android для выполнения действий при изменении местоположения - PullRequest
1 голос
/ 12 января 2012

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

Вот код onCreate моего сервиса.

public void onCreate() {
        super.onCreate();
        Log.i(TAG, "Service creating");

        //timer = new Timer("TweetCollectorTimer");
        //timer.schedule(updateTask, 1000L, 60 * 1000L);
        LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
          lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
      }

Он может что-то сделать, когда мое местоположение изменится. Тем не менее, я получаю следующее предупреждение в моей logcat: «отправка сообщения обработчику в мертвой ветке»

Я хотел бы знать, в чем проблема, и есть ли лучший способ реализовать то, что я хотел сделать?

1 Ответ

1 голос
/ 12 января 2012

Вы должны быть осторожны с вашим слушателем местоположения и жизненными циклами вашей активности.

Если вы запрашиваете обновления местоположения в методе onCreate() вашей деятельности, обязательно отмените его регистрацию позже, например, onDestroy(), хотя, на мой взгляд, было бы лучше зарегистрировать его onStart() и отменить его onStop().

Похоже, что ваш слушатель местоположения вызывает метод для действия, которое уже может быть мертвым.

Если вы планируете реализовать обнаружение местоположения в более чем одном действии, может быть целесообразно создать базовый класс, содержащий прослушиватель, вызывающий абстрактный метод при обновлении местоположения. Вы можете продвинуть его дальше, переопределив onStart() для регистрации слушателя и onStop() для отмены регистрации слушателя. Хотя не забывайте вызывать супер-конструктор как в этом абстрактном классе, так и в дочерних классах.

Надеюсь, это поможет и не слишком запутанно!

РЕДАКТИРОВАТЬ:

Пример кода приведен ниже:

public abstract class LocationActivity extends Activity {

    private LocationListener mLocationListener;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mLocationListener = new LocationListener() {
            @Override
            public void onLocationChanged(final Location location) {
                updateLocation(location);
            }

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

            @Override
            public void onProviderEnabled(final String provider) {
            }

            @Override
            public void onProviderDisabled(final String provider) {
            }
        };
    }

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

        // register your listener with the location manager
    }

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

        // unregister your listener from the location manager
    }

    protected abstract void updateLocation(Location location);
}
...