在一个android服务,我已经创建线程(s)做一些后台任务。

我有一个线程需要在主线程的消息队列上发布某个任务的情况,例如一个可运行的。

有没有办法得到主线程的处理程序和post Message/Runnable到它从我的其他线程?


当前回答

ContextCompat.getMainExecutor(context).execute {
  // do something
}

其他回答

使用处理器的更精确的Kotlin代码:

Handler(Looper.getMainLooper()).post {  
 // your codes here run on main Thread
 }

使用Kotlin,在任何函数中都是这样的:

runOnUiThread {
   // Do work..
}

我能想到的一个方法是:

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
}

如果你在线程中运行代码,例如延迟一些动作,那么你需要从上下文调用runOnUiThread。例如,如果你的代码在MainActivity类中,那么使用这个:

MainActivity.this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        myAction();
    }
});

如果你的方法可以从main (UI线程)或其他线程调用,你需要像这样检查:

public void myMethod() {
   if( Looper.myLooper() == Looper.getMainLooper() ) {
       myAction();
   }
   else {

}