我需要检查运行某段代码的线程是否是主(UI)线程。我怎样才能做到这一点呢?
当前回答
一种基于协程的、与android无关的方法:
val onMainThread: Boolean
get() = Thread.currentThread() === try {
runBlocking(Dispatchers.Main.immediate) {
Thread.currentThread()
}
} catch (e: IllegalStateException) {
// No main dispatcher has been registered; not in an Android context?
null
}
其他回答
总结解决方案,我认为这是最好的一个:
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
}
});
您可以尝试Thread.currentThread().isDaemon()
最好的方法是最清晰、最健壮的方法:*
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
或者,如果运行时平台是API级别23 (Marshmallow 6.0)或更高:
Looper.getMainLooper().isCurrentThread()
参见Looper API。注意,调用loop . getmainlooper()涉及同步(请参阅源代码)。您可能希望通过存储返回值并重用它来避免开销。
* greg7gkb和2cupsOfTech
你可以在android DDMS logcat中验证它,其中进程id将是相同的,但线程id将不同。
你可以使用下面的代码来知道当前线程是否是UI/主线程
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
或者你也可以用这个
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
这里有一个类似的问题
推荐文章
- 为什么在Java 8中String.chars()是整数流?
- 自动适合Android的TextView
- 无法创建Android虚拟设备
- 在Java中数组是按值传递还是按引用传递?
- 如何在Spring中以编程方式获取当前活动/默认环境概要文件?
- equals vs Arrays。Java中的等号
- 为什么我们通常用|| / |?有什么不同?
- 如何在Android中获得一个RadioGroup的选定索引
- 如何大写一个字的第一个字母在字符串使用Java?
- 禁用IntelliJ星(包)导入?
- 面试问题:检查一个字符串是否是另一个字符串的旋转
- 如何分配文本大小在sp值使用java代码
- 将文件加载为InputStream的不同方法
- Manifest合并失败:uses-sdk:minSdkVersion 14
- 到底是什么导致了堆栈溢出错误?