Обновить пользовательский интерфейс данных о местоположении с помощью AsyncTaskLoader?


Я использую API FusedLocationProvider для приложения. Местоположение устройства должно регулярно обновляться, так как пользователь, как ожидается, будет перемещаться все время, и приложение должно вести себя по-разному в зависимости от текущего местоположения устройства.

Чтобы очистить основной поток от сетевых запросов, я хотел переместить код для получения данных о местоположении в отдельный загрузчик. Однако я понятия не имею, куда поместить эту часть кода:

locationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(UPDATE_INTERVAL)
            .setFastestInterval(FASTEST_INTERVAL);


        try{
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, this);
        }catch (SecurityException a){Log.w(TAG,"No location permission.");}

Если я поставлю это в LoaderClass и вызовите этот метод в loadInBackground (), будет Ошибка java.lang.NullPointerException: Calling thread must be a prepared Looper thread.

Также очень неправильно снова и снова вызывать загрузчик. Поэтому мой вопрос заключается в том, как я могу реализовать requestLocationUpdates с помощью загрузчиков, чтобы загрузчик обновил измененное местоположение, которое я могу получить в onLoadFinished () и обновить соответствующий пользовательский интерфейс? И что мне делать с методом onLocationChanged () слушателя Location, который необходимо переопределить? Или есть возможно, еще один эффективный способ переместить FusedLocationProvider в фоновый поток?

Было бы очень здорово, если бы кто-нибудь помог мне здесь, большое-большое спасибо!
1 3

1 ответ:

или, возможно, существует другой эффективный способ переместить FusedLocationProvider в фоновый поток? Было бы очень здорово, если бы кто-нибудь помог мне здесь, большое-большое спасибо!

Если вы хотите получать обновления местоположения в фоновом потоке, вы можете использовать Looper версию метода requestLocationUpdates.

RequestLocationUpdates (GoogleApiClient, LocationRequest, LocationListener, Looper)

В этом случае метод onLocationChanged будет запущен в потоке петлителя.

private HandlerThread mLocThread;
private void initThread(){
    mLocThread = new HandlerThread("locationThread");
    mLocThread.start();
}

private void requestLocUpdates(){
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, 
    locationRequest, this, mLocThread.getLooper());
}

@Override
public void onLocationChanged(Location location) {
    // locationThread thread
}