【问题标题】:How to know if this thread is a UI Thread如何知道这个线程是否是 UI 线程
【发布时间】:2012-10-03 01:53:53
【问题描述】:

Android 上是否有任何方法可以知道运行我的代码的线程是否是 UI 线程?在摇摆中,有SwingUtilities.isEventDispatchThread() 告诉我我是否在 UI 线程上。 Android SDK 中是否有任何功能可以让我知道这一点?

【问题讨论】:

  • 为什么你需要知道你的代码在哪个线程上运行?如果它适用于 UI 线程,只需将其分派到那里即可。
  • 你通常只知道一个方法何时在 ui 线程上执行。特别是您有疑问的任何情况?
  • 无特殊情况。只是一种确定我的多线程代码的方法。

标签: java android ui-thread


【解决方案1】:
  1. 从这里借来的答案:How to check if current thread is not main thread

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

  2. 任何 Android 应用都只有一个 UI 线程,因此您可以在 Activity 回调中的某个位置(例如 onCreate())检查并存储其 ID,然后将该线程的 ID 与存储的 ID 进行比较。

    mMainThreadId = Thread.currentThread().getId();

  3. 无论如何,您可以省略检查是否要在 UI 线程上执行某些操作,并通过使用对 Activity 进行任何引用

    mActivity.runOnUiThread( new Runnable() {
        @Override 
        public void run() {
        ...
        }
    });
    

如果是 UI,则保证在当前线程上运行,或者在 UI 线程中排队。

【讨论】:

    【解决方案2】:

    是的,有办法。 检查当前线程对象与主剪裁器的线程对象。主循环器始终在 UI 线程中。

    boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();
    

    【讨论】:

      【解决方案3】:

      嗯实际上由于Android架构,所有Activity都运行在主线程,即UI线程。因此,当您编写 Activity 代码时,Activity 中的所有内容都在 UI 线程中。
      这就是为什么在 Honeycomb 中,当您在主线程中进行网络调用时添加了一个错误:它完全阻塞了 UI。

      所以默认情况下,您实际上总是在 UI 线程中工作。 另一件事:除非您明确要求它位于另一个线程中,否则 Service 将在与其应用程序的活动相同的线程上运行。

      那么,该怎么办?

      • 在您的活动中必须进行大量计算时;一种解决方案是使用 AsyncTask(旨在让您轻松使用另一个线程的类)。 onExecute() 中的代码在另一个线程中运行(但要小心 postExecute 在您的主线程中运行)。另一种是在 AsyncTask 没有真正适配的时候手动启动一个新线程。
      • 如果您创建的服务执行代价高昂的后台任务,请使用清单的 android:process=":my_process" 属性使其在另一个线程中运行。您需要创建一个 AIDL 来与这个分离的服务进行通信,但这并不是一项复杂的任务。
      • 许多对象(例如 MediaPlayer)都有其方法的异步变体。尽量始终使用它们。

      【讨论】:

        【解决方案4】:

        在您要检查的地方放置一个断点,当它被击中时,检查您是否可以与您的 UI 交互(即,如果 UI 未冻结)。如果您无法与 UI 交互,则您处于 UI 线程中,否则您处于后台线程中。

        【讨论】:

          猜你喜欢
          • 2019-07-21
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-29
          • 1970-01-01
          相关资源
          最近更新 更多