如何检测Android上的UI线程?

Posted

技术标签:

【中文标题】如何检测Android上的UI线程?【英文标题】:How to detect UI thread on Android? 【发布时间】:2011-02-20 08:55:40 【问题描述】:

是否有可靠的方法来检测 Thread.currentThread() 是否是应用程序中的 android 系统 UI 线程? 我想在我的模型代码中添加一些断言,断言只有一个线程(例如 ui 线程)访问我的状态,以确保不需要任何同步。

【问题讨论】:

在这里查看我的答案:***.com/a/41280460/878126 【参考方案1】:

确定 UI 线程身份的常用做法是通过Looper#getMainLooper:

if (Looper.getMainLooper().getThread() == Thread.currentThread()) 
  // On UI thread.
 else 
  // Not on UI thread.

从 API 级别 23 起,在主循环器上使用新的辅助方法 isCurrentThread 有一种更易读的方法:

if (Looper.getMainLooper().isCurrentThread()) 
  // On UI thread.
 else 
  // Not on UI thread.

【讨论】:

***.com/questions/11411022/…这个答案也不错)【参考方案2】:

我认为最好的方法是:

 if (Looper.getMainLooper().equals(Looper.myLooper())) 
     // UI thread
  else 
     // Non UI thread
 

【讨论】:

不需要使用equals,因为我们只是比较引用,最重要的是,它们都是静态的。【参考方案3】:

从 API 级别 23 开始,Looper 有一个很好的辅助方法 isCurrentThread。您可以通过这种方式获取mainLooper 并查看它是否是当前线程的那个:

Looper.getMainLooper().isCurrentThread()

实际上是一样的:

Looper.getMainLooper().getThread() == Thread.currentThread()

但它可能更易读,更容易记住。

【讨论】:

【参考方案4】:
public boolean onUIThread() 
    return @987654321@.@987654322@.@987654323@;

但它需要 API 级别 23

【讨论】:

很高兴知道!【参考方案5】:

除了检查looper,如果你曾尝试注销onCreate()中的线程ID,你可以找到UI线程(主线程) id 总是等于 1。因此

if (Thread.currentThread().getId() == 1) 
    // UI thread

else 
    // other thread

【讨论】:

我找不到任何官方文档可以证实这是真的,而且永远都是。有链接吗? 这是我想监控多线程行为时在logcat中发现的。你可以尝试输出线程id 我强烈建议不要这样做,因为此值可能特定于您的设备和/或 Android 版本。即使现在每台 Android 设备都是这种情况,也不能保证在以后的版本中也会继续这种情况。在运行 onCreate() 时将线程 ID 保存在类成员中对我来说似乎更合理。【参考方案6】:

Kotlin 的不错的扩展:

val Thread.isMain get() = Looper.getMainLooper().thread == Thread.currentThread()

所以你只需调用:

Thread.currentThread().isMain

【讨论】:

【参考方案7】:

您不能在Activity 类中使用runOnUiThread 方法吗?见..

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29

【讨论】:

我的应用程序正在运行,但是,它有几个作者并且变得相当大和复杂。我想要做的是添加一个额外的安全网,如果有人正在调用一个设计为只能从另一个线程从 GUI 线程调用的方法,则该断言可以捕获错误。 我目前正在修复使用 runOnUiThread 导致 UX 闪烁的错误。

以上是关于如何检测Android上的UI线程?的主要内容,如果未能解决你的问题,请参考以下文章

子线程中如何修改ui界面

Android开发之——怎么检测UI卡顿?(线上及线下)

如何在android一条单独线程,更新ui ?

Android 怎么启动一个工作线程及线程如何与UI线程交互

检测是不是在 WPF 和 Winforms 中的 UI 线程上

Android 操作UI线程的一些方法