android - HandlerThread:每个线程只能创建一个 Looper
问题描述
这是使用android looper 的一个很常见的问题,但是很奇怪我使用的是HandlerThread,而且我从来没有调用Looper.prepare。不知道为什么会这样。
整个崩溃日志如下:
java.lang.RuntimeException:process_network1
在 com.xiaomi.smarthome.library.common.util.MessageHandlerThread.run(MessageHandlerThread.java:43)
原因:java.lang.RuntimeException:每个线程只能创建一个 Looper
在 android.os.Looper.prepare(Looper.java:92)
在 android.os.Looper.prepare(Looper.java:87)
在 android.os.HandlerThread.run(HandlerThread.java:54)
在 com.xiaomi.smarthome.library.common.util.MessageHandlerThread.run(MessageHandlerThread.java:40)
MessageHandlerThread 如下:
public class MessageHandlerThread extends HandlerThread {
private static final int DUR_TIME = 2 * 60 *60 *1000;
private static final int MSG_EMPTY_MSG = 1;
private Handler mHandler;
public MessageHandlerThread(String name) {
super(name);
}
public MessageHandlerThread(String name, int priority) {
super(name, priority);
}
void init() {
mHandler = new Handler(this.getLooper()) {
@Override
public void handleMessage(Message msg) {
mHandler.sendEmptyMessageDelayed(MSG_EMPTY_MSG, DUR_TIME);
}
};
mHandler.sendEmptyMessageDelayed(MSG_EMPTY_MSG, DUR_TIME);
}
@Override
public synchronized void start() {
super.start();
init();
}
@Override
public void run() {
try {
super.run();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(getName(), e);
}
}
}
它在“ super.run() ;”中崩溃 为什么会发生这种情况?似乎进入运行两次?我绝对从不叫“ thread.run() ”
解决方案
HandlerThread
正在扩展Thread
课程。
当你创建一个扩展类时Thread
,你调用的是start
方法,而不是run
方法。这表明该run
方法将在start
内部由方法调用。
只需删除super.run()
语句,即可解决您的问题。
您可以在不扩展HandlerThread
类的情况下做到这一点,如下所示。
HandlerThread messageHandlerThread = new HandlerThread("MessageHandlerThread");
messageHandlerThread.start();
Handler handler = new Handler(messageHandlerThread.getLooper());
handler.post(<<YOUR_RUNNABLE>>);
推荐阅读
- reactjs - Prettier 不尊重自闭 jsx 标签
- django - 我的应用没有将 AUTH_USER_MODEL 识别为默认用户模型
- python - 如何在情节中制造传奇?
- typescript - TypeError:navigation.navigate 不是函数
- vue.js - 使用 Nuxt Content 在 Markdown 中使用 Vuetify 组件时出错
- node.js - 如何设置快速网关以安全地连接我的服务
- javascript - 删除 body 标签内的 span 标签
- javascript - React JS状态数组在函数内部为空,但项目出现在渲染中
- javascript - MySQL使用nodejs将新用户插入数据库
- java - 方向改变后播放位置重置为零