当在我的应用程序中进行此回调时,我有很多工作要做(通过ORM lib读取和写入sql db以及一些基于距离的计算).当然我担心不会阻塞主UI线程所以我一直在尝试(不成功)找出这是否是进行回调的线程.如果是,我打算在回调发生时触发的AsyncTask上完成上述所有工作.同样的AsyncTask也将从2个独立的活动类中接收事件. (响应用户输入等..)
我在这个回调周围发现的很多讨论似乎是基于人们试图改变实际收到回调的线程.这对我没有意义.当然,平台确定了这个回调的上下文,并且当收到它时要做的明智的事情是将任何严肃的工作卸载到另一个线程上,AsyncTask看起来是合适的.
如果有人可以概述他们在这里使用的成功模式,那将非常有用.
解决方法
根据
LocationManager
的Android参考文档:
The calling thread must be a Looper thread such as the main thread of
the calling Activity.
这意味着初始化回调的Thread必须是主线程或Looper线程.
我发现处理这个的最好方法是在主线程上注册一个OnLocationChanged接收器.然后,在我的回调中,我将创建一个Runnable发送到后台线程,在那里我将执行任何长时间运行的任务(比如写入数据库).
ExecutorService mThreadPool = Executors.newSingleThreadExecutor(); @Override public void onLocationChanged(Location location) { mThreadPool.execute(new Runnable() { @Override public void run() { // Perform your long-running tasks here. //... } }); }