【问题标题】:HandlerThread throws RuntimeException Only one Looper may be created per threadHandlerThread 抛出 RuntimeException 每个线程只能创建一个 Looper
【发布时间】:2019-01-22 01:46:02
【问题描述】:

此崩溃报告仅包含系统跟踪,因为它发生在 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 调用了 looper 的准备。 我只是不明白为什么 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。我说的对吗?

【问题讨论】:

  • 你能把你的代码贴在你得到这个错误的地方吗?

标签: android looper


【解决方案1】:

我认为我们可以扩展 HandlerThread

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

但我不知道原因。

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 2016-03-19
    • 2012-01-16
    • 2011-04-22
    • 2014-05-27
    • 1970-01-01
    • 2011-12-08
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多