我在我的Android应用程序中,我有UI线程(显然),还有一些其他线程,我用来做一些工作。我的UI线程中有一些侦听器在等待其他线程中完成的工作(我们称之为workComplete
事件)。
我现在面临一个问题。当我的侦听器接收到调用时,当前线程是工作线程,而不是UI线程。因此,如果我试图做一些应该来自UI线程的事情(修改视图等),它会中断或发出警告。
我的问题是:最好的方法是什么?当worker完成它的工作并调用listener的workComplete
事件时,我想回到UI线程中。
谢谢!
返回常用的UI线程的方法是使用最初在UI线程上创建的处理程序进行发布:
//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()
方法。
来自文件:
void android.app.Activity.runOnUiThread(可运行操作)
在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该动作。如果电流线程不是UI线程,操作被发布到事件队列UI线程的。
参数:action要在UI线程上运行的操作
所以在你的工作中完成事件:
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