Answers:
您可以使用以下代码来了解当前线程是否为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。因此两者都是安全的,并具有相同的结果,但第一个则稍慢一些,因为它在地图内查找循环器及其相关线程并做其他事情。
最好的方法是最清晰,最可靠的方法:*
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
或者,如果运行时平台是API级别23(棉花糖6.0)或更高版本:
Looper.getMainLooper().isCurrentThread()
请参阅Looper API。请注意,调用Looper.getMainLooper()
涉及同步(请参阅参考资料)。您可能希望通过存储返回值并重新使用它来避免开销。
* 信用greg7gkb和2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
,我认为这还不太清楚。我相信greg7gkb。
总结解决方案,我认为这是最好的解决方案:
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
}
请允许我在此开头:我承认该帖子带有“ 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
}
在记忆之前,我曾进行过一些尴尬的搜索,但希望它会对其他人有所帮助!
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
}
您可以尝试Thread.currentThread()。isDaemon()