【问题标题】:Update Location data UI using AsyncTaskLoader?使用 AsyncTaskLoader 更新位置数据 UI?
【发布时间】:2017-05-08 15:09:28
【问题描述】:

我正在为应用程序使用 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也感觉很不对劲。 所以我的问题是如何使用 Loaders 实现 requestLocationUpdates,以便 Loader 更新我可以在 onLoadFinished() 中检索的更改位置并更新相应的 UI?我应该如何处理需要覆盖的位置侦听器的 onLocationChanged() 方法?或者是否有另一种有效的方法可以将 FusedLocationProvider 移到后台线程中?

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

【问题讨论】:

    标签: java android multithreading loader fusedlocationproviderapi


    【解决方案1】:

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

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

    requestLocationUpdates(GoogleApiClient, LocationRequest, LocationListener, Looper)

    在这种情况下,onLocationChanged 方法将在 looper 的线程上触发。

    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
    }
    

    【讨论】:

    • 感谢您的快速回复!我真的很抱歉我对 android 还没有那么丰富的经验,因此我不太了解 Looper 线程在我的情况下是什么。这是否意味着我必须在某种程度上创建一个新的后台线程?
    • 是的,你是对的,但这些主题不是可以在评论中描述的。我更新了答案以提供更好的主意。您可以查看link 了解线程和弯针是什么。
    • 好的,我阅读了您给我的链接和其他几个教程/文档,但仍有一些不清楚的地方:所以我是否必须创建一个可运行的对象,在其中覆盖 OnLocationChanged() ?还是我必须包括例如requestLocUpdates 你在上面写的 runnable 吗?
    • @Blackkara 说位置更新将发生在我传入的 looper 线程上是否正确?还有关于活套和线程的很好的链接。
    • @NoobDogg 是的,检查 onLocationChanged() 方法中的当前线程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    相关资源
    最近更新 更多