如何检查当前线程不是主线程?

462

我需要检查运行特定代码的线程是否为主线程(UI线程)。如何实现?


演示如何使用线程示例来查找代码运行在哪个线程上。http://code2concept.blogspot.in/2015/02/androidhow-to-find-on-which-thread-code.html - Nitesh Tiwari
15个回答

1
Xamarin.Android端口:(C#
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
    ? Looper.MainLooper.IsCurrentThread
    : Looper.MyLooper() == Looper.MainLooper;

使用方法:

if (IsMainThread) {
    // you are on UI/Main thread
}

0

所以又一个答案加入公司,用于某些扩展文件的Kotlin:

import android.os.Looper.getMainLooper
import java.lang.Thread.currentThread

val Thread.isMain get() = getMainLooper().thread == this

val isThreadMain get() = getMainLooper().thread == currentThread()

-3

一个简单的Toast消息也可以作为快速检查。


怎么做?能否请您展示一下Toast代码? - KJEjava48
Toast.makeText(activity, "Hello main thread", Toast.LENGTH_LONG).show(); - Stefan Irndorfer

-3
基于协程的、与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
    }

@Renetik,能否详细说明一下?你能在非Android环境下提出更好的解决方案吗? - Stephen Talley

-7
你可以尝试使用 Thread.currentThread().isDaemon()。

我不确定UI线程是否是守护线程,但我会相信你的说法。但是,你如何区分我可能(但不应该)创建的守护线程呢? - AxelH
我在我的Web应用程序中进行了测试,发现UI线程是一个守护线程。我在Eclipse环境中设置了一些调试断点并进行了验证。线程详细信息显示为Thread [http-bio-8080-exec-7,5,main]。点击一些UI页面并检查调试点。 - Shailendra Singh
此外,即使在线程名称中显示“main”,但在线程对象上调用setDaemon(true)将使其成为守护进程。 - Shailendra Singh
你没有读到好的部分...我并不完全怀疑它是一个Daemon,我只是在说你不能像这样区分其他的Daemon线程。 - AxelH
换句话说: 主线程可以是守护线程,但并非所有守护线程都是主线程。(这里要求的是识别主线程。) - user1531971
另外,需要注意的是,主线程作为守护进程并不在程序员的控制之下,API或VM的更改可能导致此断言不成立。 - user1531971

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接