8

在我的应用程序中进行此回调时,我有很多工作要做(通过 ORM 库和一些基于距离的计算读取和写入 SQL db)。当然,我担心不会阻塞主 UI 线程,所以我一直在尝试(不成功)找出这是否是进行回调的线程。如果是,我打算对回调时触发的 AsyncTask 执行上述所有工作。同样的 AsyncTask 也将接收来自 2 个独立活动类的事件。(响应用户输入等。)

我发现的很多关于这个回调的讨论似乎都是基于人们试图改变实际接收回调的线程。这对我来说毫无意义。当然,平台会确定此回调的上下文,并且在接收到它时要做的明智的事情是将任何严肃的工作转移到另一个线程上,这对于 AsyncTask 似乎是合适的。

如果有人可以概述他们在这里使用的成功模式,那将非常有用。

4

1 回答 1

7

根据 Android 参考文档LocationManager

调用线程必须是Looper线程,例如调用Activity的主线程。

这意味着初始化回调的线程必须是主线程或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.
            //...
        }
    });
}
于 2012-06-21T00:29:08.177 回答