gpt4 book ai didi

java - 解决 Android SDK bug : Handler. getLooper() 清除线程中断状态

转载 作者:行者123 更新时间:2023-12-01 17:53:12 26 4
gpt4 key购买 nike

我花了几个小时追查我的代码丢失线程中断状态的原因,结果发现它实际上是由 Android SDK 中的错误引起的!看一下Looper.getLooper()方法:

    /**
* This method returns the Looper associated with this thread. If this thread not been started
* or for any reason isAlive() returns false, this method will return null. If this thread
* has been started, this method will block until the looper has been initialized.
* @return The looper.
*/
public Looper getLooper() {
if (!isAlive()) {
return null;
}

// If the thread has been started, wait until the looper has been created.
synchronized (this) {
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
return mLooper;
}

请注意,它会处理 InterruptedException 而不会重新中断!

既然我知道这不是我的代码的问题,那么解决这个问题的最佳方法是什么?我是否应该在调用 .getLooper() 之前将线程的中断状态存储到一个标志中,然后在调用之后,如果设置了该标志,则中断自己?任何想法将不胜感激:)

最佳答案

该方法是公开的您可以通过扩展此处理程序来创建自己的处理程序,并重写该方法以使其执行您想要的操作,而无需调用 super

 public class BetterHandler extends Handler {
@Override
public Looper getLooper(){
if (!isAlive()) {
return null;
}

// If the thread has been started, wait until the looper has been created.
synchronized (this) {
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
throw e
}
}
}
return mLooper;
}

}

并在任何需要的地方使用新的处理程序。显然,您无法为那些在代码之外使用处理程序类的人替换该处理程序类。

关于java - 解决 Android SDK bug : Handler. getLooper() 清除线程中断状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60761901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com