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

时间:2016-09-21 11:15:22

标签: java android ui-thread android-runonuithread

我已陷入需要从两个不同的线程进行相同的UI操作(让我们显示Toast消息)的情况。区别在于第一个线程是活动的UI线程,另一个是我开始运行某个后台进程的单独线程。问题是确保显示Toast消息的代码始终从UI线程运行的最佳实践是什么。我在这里看到两种可能性。

我们有一个函数应该显示测试消息,如

private void showToast() {
     Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}

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

另一个选项是确保显示Toast的代码在方法UI thread内的showToast()上运行。这样的事情:

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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