【问题标题】:onLocationChanged callback is made on what thread? The main UI thread?onLocationChanged 回调是在哪个线程上进行的?主 UI 线程?
【发布时间】:2012-06-21 00:13:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: android locationlistener


    【解决方案1】:

    根据LocationManager 的Android 参考文档:

    调用线程必须是Looper线程,比如主线程 调用活动。

    这意味着初始化回调的线程必须是主线程或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.
                //...
            }
        });
    }
    

    【讨论】:

    • 从文档看来,调用 onLocationChanged 的​​线程确实取决于传递给使用哪个 requestLocationUpdate(..) 调用的参数。此外,如果 Looper 不是参数之一,则回调将在主 UI 线程的上下文中进行。需要阅读更多关于 Loopers 的内容。上面的解决方案看起来很明智。我现在想知道它在性能方面与使用 AsyncTask 相比如何。所以我会去阅读文档,就像我一开始就应该做的那样。感谢您的帮助。
    • 你是对的,注册LocationListener回调有几个选项。绝对推荐阅读文档。上述解决方案大致相当于使用AsyncTask。我相信如果您查看 AsyncTask 类的源代码,您会发现它在内部使用了 ExecutorService。但是,如果您在任务完成后不需要与 UI 线程交互,您会发现 AsyncTask 的作用超出了您的需要。
    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多