437

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

4

12 回答 12

779
Looper.myLooper() == Looper.getMainLooper()

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

于 2012-07-10T10:12:18.473 回答
134

您可以使用下面的代码来了解当前线程是否是 UI/主线程

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

或者你也可以使用这个

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

这是类似的问题

于 2012-07-10T10:14:04.973 回答
68

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

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

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

Looper.getMainLooper().isCurrentThread()

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

   *归功于greg7gkb2cupsOfTech

于 2015-12-02T20:42:23.867 回答
27

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

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
    }
});
于 2016-12-22T10:02:55.980 回答
7

你可以检查

if(Looper.myLooper() == Looper.getMainLooper()) {
   // You are on mainThread 
}else{
// you are on non-ui thread
}
于 2018-11-27T10:24:02.083 回答
3

请允许我以此作为开头:我承认这篇文章有“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
}

在记住这一点之前我已经搜索过有点尴尬,但希望它可以帮助其他人!

于 2019-08-27T13:47:00.587 回答
1

you can verify it in android ddms logcat where process id will be same but thread id will be different.

于 2012-07-10T10:18:09.077 回答
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
}
于 2019-01-16T08:00:38.063 回答
1

首先检查它是否是主线程

在科特林

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

在 Java 中

static boolean isRunningOnMainThread() {
  return Thread.currentThread().equals(Looper.getMainLooper().getThread());
}
于 2022-01-09T10:07:56.897 回答
1

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

Thread.currentThread().name

于 2022-03-01T08:21:13.320 回答
-1

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

于 2021-01-19T14:41:27.477 回答
-6

你可以试试 Thread.currentThread().isDaemon()

于 2016-11-29T13:36:23.203 回答