【问题标题】:Android multithreading with event listeners带有事件监听器的 Android 多线程
【发布时间】:2014-08-31 04:06:02
【问题描述】:

我在我的 Android 应用程序中,我有 UI 线程(显然)以及我用来做一些工作的其他一些线程。我的 UI 线程中有监听器等待其他线程中的工作完成(我们称之为workComplete 事件)。

我正面临一个问题。当我的监听器收到调用时,当前线程是工作线程,而不是 UI 线程。所以,如果我尝试做一些应该来自 UI 线程的事情(修改视图等),它会中断或发出警告。

我的问题是:最好的方法是什么?当工作人员完成工作并调用侦听器的workComplete 事件时,我想回到 UI 线程。

谢谢!

【问题讨论】:

标签: java android multithreading events listener


【解决方案1】:

返回 UI 线程常用的方法是使用最初在 UI 线程上创建的 Handler 发布:

//create thread on UI Thread (associates with Looper)
Handler handler = new Handler();

//then use it in a background thread
handler.post(new Runnable(){
    public void run(){
        //back on UI thread...
    }
}

【讨论】:

    【解决方案2】:

    您可以在Activity 类中使用runOnUiThread() 方法。

    来自文档:

    void android.app.Activity.runOnUiThread(可运行动作)

    在 UI 线程上运行指定的操作。如果当前线程是 UI 线程,则立即执行该操作。如果当前 thread 不是 UI 线程,动作被发布到事件队列 UI 线程。

    参数:action 在UI线程上运行的动作

    所以在你的 workComplete 事件中:

    runOnUiThread(new Runnable() {
        public void run() {
             // Do some cool UI stuff here ...
        }
    }
    

    如果你在一个片段中,你可以调用getActivity().runOnUiThread(runnable)

    【讨论】:

      【解决方案3】:

      根据我的说法,你必须使用线程池执行器,甚至谷歌都有示例代码,它将描述如何将图像提交到多个线程如何在下载和解码完成时提交任务以及更新 ui 线程,这是我学习的最佳示例对我帮助很大。

      https://developer.android.com/training/multiple-threads/create-threadpool.html

      处理程序

      https://developer.android.com/training/multiple-threads/communicate-ui.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        相关资源
        最近更新 更多