22

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

4

4 回答 4

40
  1. 从这里借来的答案:如何检查当前线程是否不是主线程

    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 线程中排队。

于 2012-10-12T09:28:24.663 回答
8

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

boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();
于 2014-06-04T01:27:09.367 回答
0

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

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

那么该怎么办 ?

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

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

于 2013-10-06T20:41:12.200 回答