HandlerThread:每个线程只能创建一个Looper



这是使用android looper时很常见的问题,但很奇怪的是,我使用的是HandlerThread,而我从未调用Looperprepare。不知道为什么会发生这种情况。

整个崩溃日志如下:

java.lang.RuntimeException:process_network1

在com.xiaomi.smarthome.library.common.util.MessageHandlerThread.run(MessageHandlerThread.java:43(

引起原因:java.lang.RuntimeException:每个线程只能创建一个Looper

在android.os.Looperprepare(Looper.java:92(

在android.os.Looperprepare(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>>);

最新更新