当在我的应用程序中进行此回调时,我有很多工作要做(通过ORM lib读取和写入SQL db以及一些基于距离的计算)。当然,我担心不会阻塞主UI线程所以我一直在尝试(不成功)找出这是否是进行回调的线程。如果是,我打算在回调发生时触发的AsyncTask上完成上述所有工作。同样的AsyncTask也将从2个独立的活动类中接收事件。 (响应用户输入等。)
我在这次回调中发现的很多讨论似乎是基于人们试图改变实际收到回调的线程。这对我来说毫无意义。当然,平台确定了这个回调的上下文,并且当收到它时要做的明智的事情是将任何严肃的工作卸载到另一个线程上,而AsyncTask似乎是合适的。
如果有人可以概述他们在这里使用的成功模式,那将非常有用。
答案 0 :(得分:7)
根据LocationManager
的Android参考文档:
调用线程必须是Looper线程,例如主线程 调用活动。
这意味着初始化回调的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.
//...
}
});
}