我需要检查运行某段代码的线程是否是主(UI)线程。我怎样才能做到这一点呢?
当前回答
最好的方法是最清晰、最健壮的方法:*
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
或者,如果运行时平台是API级别23 (Marshmallow 6.0)或更高:
Looper.getMainLooper().isCurrentThread()
参见Looper API。注意,调用loop . getmainlooper()涉及同步(请参阅源代码)。您可能希望通过存储返回值并重用它来避免开销。
* greg7gkb和2cupsOfTech
其他回答
你可以使用下面的代码来知道当前线程是否是UI/主线程
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
或者你也可以用这个
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
这里有一个类似的问题
您可以尝试Thread.currentThread().isDaemon()
除了之前所有的答案
inline fun <T> ensureNotOnMainThread(block: () -> T): T {
check(Thread.currentThread() != Looper.getMainLooper().thread) { "This function cannot be called on main thread" }
return block()
}
允许用它包装任何方法,示例如下:
fun isInDataBase(id: String) = ensureNotOnMainThread { db.contains(id) }
只需记录这一行,它应该打印“main”。
Thread.currentThread () . name
你可以在android DDMS logcat中验证它,其中进程id将是相同的,但线程id将不同。
推荐文章
- 为什么在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
- 到底是什么导致了堆栈溢出错误?