【发布时间】:2012-07-09 19:03:40
【问题描述】:
我需要检查运行某段代码的线程是否是主(UI)线程。我怎样才能做到这一点?
【问题讨论】:
-
用线程示例演示的示例code2concept.blogspot.in/2015/02/…
标签: java android multithreading
我需要检查运行某段代码的线程是否是主(UI)线程。我怎样才能做到这一点?
【问题讨论】:
标签: java android multithreading
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.
}
【讨论】:
Looper.myLooper() 如果线程没有与 Looper 关联,将返回 null。所以两者都是安全的并且具有相同的结果,但是第一个在 map 内部搜索以找出 looper 及其相关线程并做一些其他事情时会慢一些。
您可以在 android ddms logcat 中验证它,其中进程 ID 相同但线程 ID 不同。
【讨论】:
最好的方法是最清晰、最健壮的方法:*
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
或者,如果运行时平台是 API 级别 23 (Marshmallow 6.0) 或更高:
Looper.getMainLooper().isCurrentThread()
请参阅Looper API。请注意,调用Looper.getMainLooper() 涉及同步(请参阅source)。您可能希望通过存储返回值并重用它来避免开销。
* 感谢 greg7gkb 和 2cupsOfTech
【讨论】:
Looper.myLooper() == Looper.getMainLooper(),我认为这不太清楚。我相信 greg7gkb。
equals,因此会退回到==,但将来可能会改变。所以我更正了答案。
你可以试试 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”无关,这是我的最佳结果。为此,对于非 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 消息也可以作为快速检查。
【讨论】:
Toast.makeText(activity, "Hello main thread", Toast.LENGTH_LONG).show();
首先检查是否是主线程
在科特林中
fun isRunningOnMainThread(): Boolean {
return Thread.currentThread() == Looper.getMainLooper().thread
}
在 Java 中
static boolean isRunningOnMainThread() {
return Thread.currentThread().equals(Looper.getMainLooper().getThread());
}
【讨论】: