带有事件监听器的Android多线程

时间:2014-08-31 04:06:02

标签: java android multithreading events listener

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:2)

重新使用常用的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...
    }
}

答案 1 :(得分:1)

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

来自文档:

  

void android.app.Activity.runOnUiThread(Runnable action)

     

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

     

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

所以在你的workComplete事件:

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

如果您在片段内,可以拨打getActivity().runOnUiThread(runnable)

答案 2 :(得分:-1)

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

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

处理程序

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