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


当前回答

除了之前所有的答案

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无关的方法:

val onMainThread: Boolean
    get() = Thread.currentThread() === try {
        runBlocking(Dispatchers.Main.immediate) {
            Thread.currentThread()
        }
    } catch (e: IllegalStateException) {
        // No main dispatcher has been registered; not in an Android context?
        null
    }

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

总结解决方案,我认为这是最好的一个:

boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M 
    ? Looper.getMainLooper().isCurrentThread()
    : Thread.currentThread() == Looper.getMainLooper().getThread();

并且,如果你想在UI线程上运行一些东西,你可以使用这个:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
       //this runs on the UI thread
    }
});
Looper.myLooper() == Looper.getMainLooper()

如果返回true,那么你在UI线程上!