【问题标题】:Android: Best practice to ensure that a UI operation is done on UI threadAndroid:确保在 UI 线程上完成 UI 操作的最佳实践
【发布时间】:2016-09-21 11:15:21
【问题描述】:

我遇到了需要从两个不同的线程执行一些相同的 UI 操作(比如说显示 Toast 消息)的情况。不同之处在于第一个线程是活动的 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();
            }
        });
    }

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

【问题讨论】:

标签: java android ui-thread android-runonuithread


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-01
        • 2012-02-24
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 2013-12-11
        • 2020-03-17
        • 1970-01-01
        相关资源
        最近更新 更多