Android:确保 UI 操作在 UI 线程上完成的最佳实践

Android: Best practice to ensure that a UI operation is done on UI thread

我遇到了需要从两个不同的线程执行一些相同的 UI 操作(比如说显示 Toast 消息)的情况。区别在于第一个线程是 activity 的 UI 线程,另一个是我开始 运行 某些后台进程的单独线程。问题是确保显示 Toast 消息的代码始终来自 UI 线程的 运行 的最佳实践是什么。我在这里看到两种可能性。

我们有一个函数应该显示像

这样的测试消息
private void showToast() {
     Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}

并且每次我们调用此方法时,我们确保必须在 UI 线程上调用它,我们可以从我们调用 showToast() 的地方使用 runOnUiThread()

另一种选择是确保显示 Toast 的代码是方法 showToast() 本身中 UI thread 上的 运行。像这样的东西:

private void showToast() {
         runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, message, Toast.LENGTH_LONG).show();
            }
        });
    }

首选做法是什么?为什么?

使用第二个选项。如果您已经在 UI-Thread 上,则该操作只会在相同的上下文中执行。 Reference

如果您询问如何确定我们当前是否在 UI 线程上,那么我建议您这样做:

Looper.myLooper() == Looper.getMainLooper()

如果我们在 UI 线程上,这将 return 为真。 否则你可以在这个方向上更深入地搜索: https://developer.android.com/training/multiple-threads/communicate-ui.html

使用第二个选项很有用,但是 Android 模式建议在使用线程时使用 AsyncTask 线程,因为您有 3 种不同的方式来使用 UI 线程(onPreExecute、onProgressUpdates和 onPostExecute).

https://developer.android.com/reference/android/os/AsyncTask.html