问答中心分类: ANDROID如何检查当前线程是否不是主线程
0
匿名用户 提问 1月 前

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

Nitesh Tiwari 回复 1月 前

示例以线程示例进行演示代码2概念。blogspot。2015年2月…

11 Answers
0
Carnal 回答 1月 前
Looper.myLooper() == Looper.getMainLooper()

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

0
AAnkit 回答 1月 前

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

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

或者你也可以用这个

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

这里有一个类似的问题

Janus Varmarken 回复 1月 前

是否应该认为后者是更安全的选项,因为不能保证任意线程与卢珀相关联(假设主线程总是与一个活套相关)?

Saeed Masoumi 回复 1月 前

Looper.myLooper()如果线程未与活套关联,则将返回null。所以两者都是安全的,并且结果相同,但是第一个在地图中搜索时会稍微慢一点,以找到活套及其相关线程,并执行其他操作。

0
Michael Allan 回答 1月 前

最好的方法是最清晰、最可靠的方法:*

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

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

Looper.getMainLooper().isCurrentThread()

看到了吗活套API.请注意Looper.getMainLooper()涉及同步(请参阅来源)。您可能希望通过存储返回值并重用它来避免开销。
   *信用greg7gkb2cupsOfTech

Mike 回复 1月 前

你所说的“API 23或更高”是什么意思?这对我来说没什么意义。。同样的答案也被安基特贴在了下面。。

Michael Allan 回复 1月 前

@迈克:谢谢,我修好了API。安基特真的很喜欢Looper.myLooper() == Looper.getMainLooper(),我认为这不太清楚。我相信greg7gkb。

2cupsOfTech 回复 1月 前

当Android Studio发出警告时,这应该是与==或equals()的比较吗?

Michael Allan 回复 1月 前

@2.仔细想想,这是个好建议。目前,这两个测试在运行时是相同的,因为线不覆盖equals,然后回到==,但这可能会在未来发生变化。所以我更正了答案。

0
android developer 回答 1月 前

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

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
    }
});
AJW 回复 1月 前

关于Handler的其他答案建议使用“.postDelayed()”而不是“.post()”。主要区别是什么?你能说说为什么建议使用“.post()”?

android developer 回复 1月 前

@当然,以下是文件:开发商安卓com/reference/android/os/… 开发商安卓com/reference/android/os/….如果希望runnable现在至少运行X ms,则使用postDelayed。

AJW 回复 1月 前

太好了,我很感谢你提供的信息。

android developer 回复 1月 前

@AJW打字错误。意思是“来自”。我想你知道。:)

KJEjava48 回复 1月 前

@androiddeveloper我如何运行主线程之外的东西???

0
Lovekush Vishwakarma 回答 1月 前

你可以查一下

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