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


当前回答

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
}

其他回答

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

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

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

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

Looper.getMainLooper().isCurrentThread()

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

* greg7gkb和2cupsOfTech

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

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

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

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
}