Местоположение не вызывается из WorkManager - PullRequest
0 голосов
/ 22 апреля 2019

Я использую менеджер работ для запуска служб определения местоположения, он загружает метод doWork() после каждого 15 minutes, но не выполняет onLocationChanged.

До того, как я использовал Job Scheduler, он работал нормально.

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

Это мой код.

   public class LocationWorker extends Worker implements LocationListener, GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener{


        private static final long BACKGROUND_INTERVAL = 1000 * 60 * 60;
        final private String TAG = LocationUpdateService.class.getSimpleName();
        LocationRequest mLocationRequest;
        GoogleApiClient mGoogleApiClient;



 @NonNull
    @Override
    public Result doWork() {


        if (isGooglePlayServicesAvailable()) {
            mGoogleApiClient = new GoogleApiClient.Builder(GlobalApplication.getAppContext())
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();

            mGoogleApiClient.connect();
            jwtToken = getJWTToken();
        }


        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(BACKGROUND_INTERVAL);
        mLocationRequest.setFastestInterval(BACKGROUND_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        return null;
    }



@Override
    public void onLocationChanged(Location location) {


        String storedLat, storedLng;
        //...

}

1 Ответ

2 голосов
/ 22 апреля 2019

Есть несколько вещей, которые не так с этим кодом:

  1. На высоком уровне вы используете Worker - который является синхронным - для выполнения асинхронного (основанного на обратном вызове) фрагмента кода. Это не сработает. Пожалуйста, прочитайте https://developer.android.com/topic/libraries/architecture/workmanager/advanced/threading (и, в частности, обратите внимание на ListenableWorker - это класс, который вы хотите использовать).

  2. Вы возвращаете нуль из метода @NonNull. WorkManager немедленно отнесется к этой работе как к неудачной. Вернуть правильное значение.

  3. Ваш интервал местоположения установлен на час. Рабочие могут выполнять не более 10 минут, поэтому это тоже не сработает. FWIW, я действительно сомневаюсь, что этот код работал правильно с JobScheduler; у него тоже есть 10-минутное окно выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...