我在我的Android应用程序我有UI线程(显然),还有一些其他线程我用来做一些工作。在我的UI线程中有听众在等待工作在其他线程中完成(我们称之为workComplete
事件)。Android多线程与事件监听器
我在那里面临一个问题。当我的监听器接收到调用时,当前线程是工作线程,而不是UI线程。所以,如果我尝试做一些应该来自UI线程的东西(修改视图等),它会打破或给出警告。
我的问题是:这是最好的方法是什么?当工作人员完成工作并调用监听器的事件时,我想回到UI线程中。
谢谢!
我在我的Android应用程序我有UI线程(显然),还有一些其他线程我用来做一些工作。在我的UI线程中有听众在等待工作在其他线程中完成(我们称之为workComplete
事件)。Android多线程与事件监听器
我在那里面临一个问题。当我的监听器接收到调用时,当前线程是工作线程,而不是UI线程。所以,如果我尝试做一些应该来自UI线程的东西(修改视图等),它会打破或给出警告。
我的问题是:这是最好的方法是什么?当工作人员完成工作并调用监听器的事件时,我想回到UI线程中。
谢谢!
的方法找回常用的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...
}
}
您可以在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)
。
根据我你必须使用线程池执行程序,甚至谷歌有示例代码,它将描述如何提交图像提交给多个线程如何提交任务时下载和解码完成并更新UI线程的一切线程这是我最好的例子学习,它对我有很大的帮助。
https://developer.android.com/training/multiple-threads/create-threadpool.html
处理
https://developer.android.com/training/multiple-threads/communicate-ui.html
一个方法是使用处理器。您还可以使用易于使用的绿色机器人的EventBus。 https://github.com/greenrobot/EventBus – Raghunandan 2014-08-31 04:59:59