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

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

【问题讨论】:

标签: android


【解决方案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.
}

【讨论】:

【解决方案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】:

      【讨论】:

      • 我的应用程序正在运行,但是,它有几个作者并且变得相当大和复杂。我想要做的是添加一个额外的安全网,如果有人正在调用一个设计为只能从另一个线程从 GUI 线程调用的方法,则该断言可以捕获错误。
      • 我目前正在修复使用 runOnUiThread 导致 UX 闪烁的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2013-04-09
      • 2011-07-05
      相关资源
      最近更新 更多