我需要检查运行某段代码的线程是否是主(UI)线程。我怎样才能做到这一点呢?


当前回答

最好的方法是最清晰、最健壮的方法:*

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

或者,如果运行时平台是API级别23 (Marshmallow 6.0)或更高:

Looper.getMainLooper().isCurrentThread()

参见Looper API。注意,调用loop . getmainlooper()涉及同步(请参阅源代码)。您可能希望通过存储返回值并重用它来避免开销。

* greg7gkb和2cupsOfTech

其他回答

你可以使用下面的代码来知道当前线程是否是UI/主线程

if(Looper.myLooper() == Looper.getMainLooper()) {
   // Current Thread is Main Thread.
}

或者你也可以用这个

if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
   // Current Thread is Main Thread.
}

这里有一个类似的问题

您可以尝试Thread.currentThread().isDaemon()

除了之前所有的答案

inline fun <T> ensureNotOnMainThread(block: () -> T): T {
    check(Thread.currentThread() != Looper.getMainLooper().thread) { "This function cannot be called on main thread" }
    return block()
}

允许用它包装任何方法,示例如下:

fun isInDataBase(id: String) = ensureNotOnMainThread { db.contains(id) }

只需记录这一行,它应该打印“main”。

Thread.currentThread () . name

你可以在android DDMS logcat中验证它,其中进程id将是相同的,但线程id将不同。