代码之家  ›  专栏  ›  技术社区  ›  mianlaoshu

HandlerThread:每个线程只能创建一个活套

  •  0
  • mianlaoshu  · 技术社区  · 6 年前

    使用android looper时,这是一个非常常见的问题,但很奇怪,我使用的是HandlerThread,而且我从未调用looper.prepare。不知道为什么会这样。

    整个事故记录如下:

    java.lang.RuntimeException:进程\网络1

    位于com.xiaomi.smarthome.library.common.util.MessageHandlerThread.run(MessageHandlerThread.java:43)

    在android.os.Looper.prepare(Looper.java:92)

    在android.os.Looper.prepare(Looper.java:87)

    运行(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 回复  |  直到 4 年前
        1
  •  0
  •   Uma Sankar    6 年前

    HandlerThread Thread

    当您创建一个扩展 线 ,你打电话 start run 方法这表明 方法将由调用 开始 方法内部。

    移除 super.run()

    您可以不扩展就完成它 手摇线 下面是一节课。

    HandlerThread messageHandlerThread = new HandlerThread("MessageHandlerThread");
    messageHandlerThread.start();
    
    Handler handler = new Handler(messageHandlerThread.getLooper());
    handler.post(<<YOUR_RUNNABLE>>);