在一个android服务,我已经创建线程(s)做一些后台任务。
我有一个线程需要在主线程的消息队列上发布某个任务的情况,例如一个可运行的。
有没有办法得到主线程的处理程序和post Message/Runnable到它从我的其他线程?
在一个android服务,我已经创建线程(s)做一些后台任务。
我有一个线程需要在主线程的消息队列上发布某个任务的情况,例如一个可运行的。
有没有办法得到主线程的处理程序和post Message/Runnable到它从我的其他线程?
当前回答
使用Kotlin,在任何函数中都是这样的:
runOnUiThread {
// Do work..
}
其他回答
Kotlin 版本
当你在做某项活动时,就用
runOnUiThread {
//code that runs in main
}
当你有活动上下文,mContext然后使用
mContext.runOnUiThread {
//code that runs in main
}
当你在一个没有上下文的地方,然后使用
Handler(Looper.getMainLooper()).post {
//code that runs in main
}
注意:这个答案已经得到了如此多的关注,我需要更新它。自从原来的答案被发布后,@dzeikei的评论获得了几乎和原来答案一样多的关注。这里有两种可能的解决方案:
1. 如果你的后台线程有一个Context对象的引用:
确保您的后台工作线程可以访问Context对象(可以是应用程序上下文或服务上下文)。然后在后台工作线程中这样做:
// Get a handler that can be used to post to the main thread
Handler mainHandler = new Handler(context.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {....} // This is your code
};
mainHandler.post(myRunnable);
2. 如果你的后台线程没有(或不需要)Context对象
(@dzeikei建议):
// Get a handler that can be used to post to the main thread
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {....} // This is your code
};
mainHandler.post(myRunnable);
还有另一种简单的方法,如果你没有访问Context的权限。
1).从主循环程序创建一个处理程序:
Handler uiHandler = new Handler(Looper.getMainLooper());
2).实现一个可运行的接口:
Runnable runnable = new Runnable() { // your code here }
3).发布你的Runnable到uiHandler:
uiHandler.post(runnable);
这就是全部;-)享受线程的乐趣,但不要忘记同步它们。
使用处理器的更精确的Kotlin代码:
Handler(Looper.getMainLooper()).post {
// your codes here run on main Thread
}
对于Kotlin,你可以使用Anko corountines:
更新
doAsync {
...
}
弃用
async(UI) {
// Code run on UI thread
// Use ref() instead of this@MyActivity
}