有没有一种可靠的方法来检测在应用程序中 Thread.currentThread()
是否为 Android 系统 UI 线程?
我想在我的模型代码中加入一些断言,以确保只有一个线程(例如 UI 线程)访问我的状态,以确保不需要任何类型的同步。
有没有一种可靠的方法来检测在应用程序中 Thread.currentThread()
是否为 Android 系统 UI 线程?
我想在我的模型代码中加入一些断言,以确保只有一个线程(例如 UI 线程)访问我的状态,以确保不需要任何类型的同步。
通常确定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.
}
我认为最好的方法是这样的:
if (Looper.getMainLooper().equals(Looper.myLooper())) {
// UI thread
} else {
// Non UI thread
}
equals
,因为我们只比较引用,并且此外它们都是静态的。 - mr5Looper
有一个很好的辅助方法isCurrentThread
。您可以获取mainLooper
并通过以下方式查看它是否为当前线程:Looper.getMainLooper().isCurrentThread()
这与以下内容基本相同:
Looper.getMainLooper().getThread() == Thread.currentThread()
但它可能会更易读且更容易记忆。
public boolean onUIThread() {
return <a rel="nofollow noreferrer" href="https://developer.android.com/reference/android/os/Looper.html">Looper</a>.<a rel="nofollow noreferrer" href="https://developer.android.com/reference/android/os/Looper.html#getMainLooper()">getMainLooper()</a>.<a rel="nofollow noreferrer" href="https://developer.android.com/reference/android/os/Looper.html#isCurrentThread()">isCurrentThread()</a>;
}
但是它需要API 23级。
looper
之外,如果您曾尝试在onCreate()
中注销线程ID,则会发现UI线程(主线程) ID始终等于1。因此,if (Thread.currentThread().getId() == 1) {
// UI thread
}
else {
// other thread
}
Kotlin的不错扩展:
val Thread.isMain get() = Looper.getMainLooper().thread == Thread.currentThread()
所以你只需要调用:
Thread.currentThread().isMain
你不能在Activity
类中使用runOnUiThread
方法吗?看看...