如何从Java中的工作线程访问主线程?
阅读很多overkilled,overcomplicated在这里的SO解决方案,对于这样一个简单的问题,如何从工作线程访问主线程,执行一些代码。如何从Java中的工作线程访问主线程?
在iOS中的dispatch_get_main_queue()
方法返回主线程。如何在Java?
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0UL), ^{
//do background thread stuff
dispatch_async(dispatch_get_main_queue(), ^{
//update UI
});
});
在Android中,你不能直接访问主线程(UI线程),但你可以在上面排队的工作,所以你需要创建一个Handler
并使用该处理后的主要工作(Runnable
)线。
下面是如何可以在UI Thread
使用Handler
new android.os.Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//Doing job here
}
})
,并张贴在评论中提到@CommonsWare一个例子,有访问UI线程的另一个方式:如果你
- 有任何
View
的实例,你可以使用View.post(Runnable)
- 如果你有
Activity
的实例,你可以使用Activity.runOnUiThread(Runnable)
顺便说一下访问在Android的主线程比Java桌面应用程序
您不需要创建'Handler',因为任何'View'都可以使用'post()',并且通常您可以访问其中的一个。 – CommonsWare
多数民众赞成在其他解决方案 –
@CommonsWare他的问题是如何从工作线程访问主线程,所以我认为他没有访问任何视图 –
从另一个运行你的主线程代码完全不同:
runOnUiThread(new Runnable() {
@Override
public void run() {
// Your code here
}
});
希望这有助于
好奇为什么downvote?说明?例如,此代码可以很好地改变AsyncTask的'doInBackground()'方法中UI的状态。这不是“正确”的方式吗? – ShadowGod
可能[从另一个线程主线程中运行代码]的副本(http://*.com/questions/11123621/running-code-in-main-thread-from-an其他线程) – Augusto
您的问题中的任何链接都与Android没有任何关系。 – CommonsWare