Обновить пользовательский интерфейс данных о местоположении с помощью 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 ответ:
или, возможно, существует другой эффективный способ переместить 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 }