HandlerThread: только один лупер может быть создан для потока - PullRequest
0 голосов
/ 04 декабря 2018

Это довольно распространенная проблема с использованием android looper, но очень странно, что я использую HandlerThread и никогда не вызываю Looper.prepare.Понятия не имею, почему это происходит.

Весь журнал аварий ниже:

java.lang.RuntimeException: process_network1

на com.xiaomi.smarthome.library.common.util.MessageHandlerThread.run (MessageHandlerThread.java:43)

Причина: java.lang.RuntimeException: только один лупер может быть создан для потока

на 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 () "

1 Ответ

0 голосов
/ 04 декабря 2018

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