从在UI线程中运行代码的角度来看,以下两者之间有什么区别:

MainActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        Log.d("UI thread", "I am the UI thread");
    }
});

or

MainActivity.this.myView.post(new Runnable() {
    public void run() {
        Log.d("UI thread", "I am the UI thread");
    }
});

and

private class BackgroundTask extends AsyncTask<String, Void, Bitmap> {
    protected void onPostExecute(Bitmap result) {
        Log.d("UI thread", "I am the UI thread");
    }
}

当前回答

芬兰湾的科特林版:

Handler(Looper.getMainLooper()).post {
   Toast.makeText(context, "Running on UI(Main) thread.", Toast.LENGTH_LONG).show()
}

或者如果你正在使用Kotlin协程: 在协程范围内添加:

withContext(Dispatchers.Main) {
   Toast.makeText(context, "Running on UI(Main) thread.", Toast.LENGTH_LONG).show()
}

其他回答

这些都不是完全相同的,尽管它们的净效果都是相同的。

第一个和第二个之间的区别是,如果您在执行代码时恰好在主应用程序线程上,那么第一个线程(runOnUiThread())将立即执行Runnable。第二个(post())总是将Runnable放在事件队列的末尾,即使您已经在主应用程序线程上。

第三个,假设您创建并执行BackgroundTask实例,将浪费大量时间从线程池中获取一个线程,执行默认的无操作doInBackground(),然后最终执行相当于post()的操作。到目前为止,这是三种方法中效率最低的。如果你在后台线程中确实有工作要做,而不仅仅是使用onPostExecute(),请使用AsyncTask。

从Android P开始,你可以使用getMainExecutor():

getMainExecutor().execute(new Runnable() {
  @Override public void run() {
    // Code will run on the main thread
  }
});

来自Android开发者文档:

返回一个Executor,它将在与此上下文关联的主线程上运行排队任务。这是用于分派对应用程序组件(活动、服务等)的调用的线程。

来自CommonsBlog:

您可以在Context上调用getMainExecutor()来获得一个Executor,该Executor将在主应用程序线程上执行它的作业。还有其他方法可以实现这一点,使用Looper和自定义Executor实现,但这种方法更简单。

芬兰湾的科特林版:

Handler(Looper.getMainLooper()).post {
   Toast.makeText(context, "Running on UI(Main) thread.", Toast.LENGTH_LONG).show()
}

或者如果你正在使用Kotlin协程: 在协程范围内添加:

withContext(Dispatchers.Main) {
   Toast.makeText(context, "Running on UI(Main) thread.", Toast.LENGTH_LONG).show()
}

使用处理程序

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // Code here will run in UI thread
    }
});

使用Handler还有第四种方法

new Handler().post(new Runnable() {
    @Override
    public void run() {
        // Code here will run in UI thread
    }
});