在一个android服务,我已经创建线程(s)做一些后台任务。
我有一个线程需要在主线程的消息队列上发布某个任务的情况,例如一个可运行的。
有没有办法得到主线程的处理程序和post Message/Runnable到它从我的其他线程?
在一个android服务,我已经创建线程(s)做一些后台任务。
我有一个线程需要在主线程的消息队列上发布某个任务的情况,例如一个可运行的。
有没有办法得到主线程的处理程序和post Message/Runnable到它从我的其他线程?
当前回答
压缩代码块如下所示:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// things to do on the main thread
}
});
这并不涉及传递活动引用或应用程序引用。
芬兰湾的科特林相当于:
Handler(Looper.getMainLooper()).post(Runnable {
// things to do on the main thread
})
其他回答
我知道这是一个老问题,但我遇到了一个在Kotlin和Java中都使用的主线程一行程序。对于服务来说,这可能不是最好的解决方案,但对于调用将改变片段内UI的东西来说,这是非常简单和明显的。
Java (8):
getActivity().runOnUiThread(()->{
//your main thread code
});
科特林:
this.runOnUiThread {
//your main thread code
}
使用Kotlin,在任何函数中都是这样的:
runOnUiThread {
// Do work..
}
如果你在线程中运行代码,例如延迟一些动作,那么你需要从上下文调用runOnUiThread。例如,如果你的代码在MainActivity类中,那么使用这个:
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
myAction();
}
});
如果你的方法可以从main (UI线程)或其他线程调用,你需要像这样检查:
public void myMethod() {
if( Looper.myLooper() == Looper.getMainLooper() ) {
myAction();
}
else {
}
我能想到的一个方法是:
1)让UI绑定到服务。 2)暴露一个方法,就像下面一个由Binder注册你的处理程序:
public void registerHandler(Handler handler) {
mHandler = handler;
}
3)在UI线程中,绑定到服务后调用上述方法:
mBinder.registerHandler(new Handler());
4)使用服务线程中的处理程序来发布你的任务:
mHandler.post(runnable);
对于Kotlin,你可以使用Anko corountines:
更新
doAsync {
...
}
弃用
async(UI) {
// Code run on UI thread
// Use ref() instead of this@MyActivity
}