HandlerThread引发RuntimeException每个线程只能创建一个Looper

时间:2018-08-15 07:09:21

标签: android looper

此崩溃报告仅包含系统跟踪,因为它发生在HandlerThread中:

  

java.lang.RuntimeException:每个线程只能创建一个Looper

     

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

     

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

     

在android.os.HandlerThread.run(HandlerThread.java:54)

似乎已经为HandlerThread调用了循环程序的prepare。 我只是不明白为什么HandlerThread再次进入。它只显示系统的java stacktrace。

我尝试多次调用HandlerThread的start()方法,它引发了java.lang.IllegalThreadStateException,而不是RuntimeException。

那么当HandlerThread抛出这样的异常时?

================================================ =========

有关HandlerThread和Handler的关键代码如下:

class MyDeviceFragment extends BaseFragment {
    private HandlerThread mWorkerThread = new HandlerThread(MyDeviceFragment .class.getName());
    private WorkerHandler mWorkerHandler;
    {
        if (mWorkerHandler == null) {
            mWorkerThread.start();
            mWorkerHandler = new WorkerHandler(mWorkerThread.getLooper());
        }
    }
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // xxxxx code
    }
    public void onDetach() {
        super.onDetach();
        if (mWorkerThread != null) {
            mWorkerThread.quit();
        }
    }

    private class WorkerHandler extends Handler {
        WorkerHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MSG_XXXXX1:
                    synchronized (mLock) {
                        // CODE
                    }
                    break;
                case MSG_XXXXX2:
                    synchronized (mLock) {
                        // CODE
                    }
                    break;
            }
        }
    }
}

并使用mWorkerHandler.sendEmptyMessage(MSG_XXX)发送消息。 mWorkerThread的初始化有点奇怪,由第三方编写,但是我认为这不会导致HandlerThread抛出RuntimeException。我说的对吗?

1 个答案:

答案 0 :(得分:0)

我认为我们可以扩展HandlerThread

@Override
public void run() {
    try {
        super.run();
    } catch (Exception e) {
        LogUtil.e(TAG, "run e =" + e);
    }
}

但是我不知道原因。