2014-08-31 131 views
3

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

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

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

谢谢!

+1

一个方法是使用处理器。您还可以使用易于使用的绿色机器人的EventBus。 https://github.com/greenrobot/EventBus – Raghunandan 2014-08-31 04:59:59

回答

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

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

从文档:

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

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

参数:行动行动,在UI线程上

所以在你workComplete事件中运行:

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

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