【问题标题】:Thread is freezing the UI only in release mode in Android线程仅在 Android 的发布模式下冻结 UI
【发布时间】:2017-05-28 13:57:31
【问题描述】:

在我的应用程序中,我们正在创建一个线程,用于通过蓝牙打印机进行打印。它在调试模式下工作正常,但在发布模式下它给出了 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 版本中出现问题,在发布模式下也是如此。

【问题讨论】:

  • 为什么不直接使用 HandlerThread 而不是实现这样的不稳定机制?

标签: android multithreading android-handler android-looper


【解决方案1】:

我假设您的 sn-p 属于扩展 Thread

的类

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

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

您也可以使用HandlerThread(就像@Kelevandos 在评论中所说)。您可以在 source code 中看到它完全按照您的意愿行事。

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

【讨论】:

    猜你喜欢
    • 2022-12-22
    • 2011-06-22
    • 2021-12-21
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多