2

在我的应用程序中,我们正在创建一个通过蓝牙打印机进行打印的线程。它在调试模式下工作正常,但在发布模式下它给出了 ANR 错误。我正在从服务启动线程。我正在使用以下代码:

@Override
    public void start() {
        super.start();
        while (!threadInitOK); // it is getting stuck here
    }

    @Override
    public void run() {
        Looper.prepare();
        mLooper = Looper.myLooper();

        if (null == mLooper)
            Log.v(TAG, "mLooper is null pointer");
        else
            Log.v(TAG, "mLooper is valid");
        workHandler = new WorkHandler();
        threadInitOK = true;
        Looper.loop();
    }

在棒棒糖版本中,它工作正常,它只是在 Marshmellow 版本中出现问题,在发布模式下也是如此。

4

1 回答 1

0

我假设你的代码片段在一个扩展的类中Thread

.start()在您的代码中肯定是从主线程调用的。因此,在这里进行阻塞等待 ( ) 并不是一个好主意while(...);

您必须使用非阻塞等待(回调、事件、信号...)来获取有关您的Looper. (例如: EventBus , RxJava )

你也可以使用HandlerThread(就像@Kelevandos 在评论中说的那样)。您可以在源代码中看到它完全符合您的要求。

如果您给我们更多代码和您的目标,我们可以为您提供更多帮助。

于 2017-01-13T09:00:13.583 回答