使用 AsyncTaskLoader 更新位置数据 UI?

Update Location data UI using AsyncTaskLoader?

我正在为应用程序使用 FusedLocationProvider API。设备的位置应该定期更新,因为预计用户会一直四处走动,并且应用程序的行为应该根据当前设备位置而有所不同。

为了让主线程免受网络请求的影响,我想将用于检索位置数据的代码移动到一个单独的加载程序中。但是,我不知道把这部分代码放在哪里:

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.

一而再再而三的调用Loader也感觉很不对劲。 所以我的问题是如何使用 Loader 实现 requestLocationUpdates,以便 Loader 更新我可以在 onLoadFinished() 中检索的更改位置并更新相应的 UI?我应该如何处理需要覆盖的Location Listener的onLocationChanged()方法?或者是否有另一种有效的方法将 FusedLocationProvider 移动到后台线程?

如果有人能在这里帮助我,那就太好了,非常感谢!

或者是否有另一种有效的方法可以将 FusedLocationProvider 移动到后台线程中?如果有人能在这里帮助我,那就太好了,非常感谢!

如果您想在后台线程中接收位置更新,可以使用 requestLocationUpdates 方法的 Looper 版本。

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
}