首页 > 解决方案 > 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()

标签: androidhandler

解决方案


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>>);

推荐阅读