如何检测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线程?的主要内容,如果未能解决你的问题,请参考以下文章
Android 怎么启动一个工作线程及线程如何与UI线程交互