如何知道这个线程是不是是 UI 线程

Posted

技术标签:

【中文标题】如何知道这个线程是不是是 UI 线程【英文标题】: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 线程上执行。特别是您有疑问的任何情况? 无特殊情况。只是一种确定我的多线程代码的方法。 How to check if current thread is not main thread的可能重复 【参考方案1】:

    从这里借来的答案:How to check if current thread is not main thread

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

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

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

    无论如何,您可以省略检查是否要在 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 线程中,否则您处于后台线程中。

【讨论】:

以上是关于如何知道这个线程是不是是 UI 线程的主要内容,如果未能解决你的问题,请参考以下文章

消息循环是不是在 UI 线程上执行?

[转]Android限制只能在主线程中进行UI访问的实现原理

WPF 支持的多线程 UI 并不是线程安全的

PYQT5怎么更新UI显示的内容

异步代码是不是在 UI 线程或新/不同线程中运行以不阻塞 UI?

在 ui 线程中执行委托(使用消息泵)