1

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

我们有一个功能应该显示测试消息,例如

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

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

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

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

哪个是首选做法,为什么?

4

3 回答 3

1

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

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

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

于 2016-09-21T12:03:35.993 回答
1

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

于 2016-09-21T12:03:34.023 回答
0

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

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

于 2016-09-21T12:13:48.477 回答