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

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

158300 次浏览
Looper.myLooper() == Looper.getMainLooper()

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

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

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

或者你也可以用这个

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

这里有一个类似的问题 .

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

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

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

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

Looper.getMainLooper().isCurrentThread()

参见尺蠖API。注意,调用Looper.getMainLooper()涉及同步(参见)。您可能希望通过存储返回值并重用它来避免开销。

* credit greg7gkb and 2cupsOfTech。才能

您可以尝试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
}
});

你可以检查一下

if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}

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
}
请允许我先说: 我承认这篇文章有“Android”标签,然而,我的搜索与“Android”无关,这是我的头号结果。为此,对于non-Android SO Java用户登陆这里,不要忘记:

public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}

在你的代码的其他地方设置了这个之后,你可以很容易地检查你是否要在主线程上执行:

if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}

有点尴尬,我在记得这个之前搜索过,但希望它能帮助其他人!

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

首先检查是否是主线程

在芬兰湾的科特林

fun isRunningOnMainThread(): Boolean {
return Thread.currentThread() == Looper.getMainLooper().thread
}

在Java中

static boolean isRunningOnMainThread() {
return Thread.currentThread().equals(Looper.getMainLooper().getThread());
}

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

Thread.currentThread () . name

除了之前所有的答案

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) }