【问题标题】:Android application doing too much work on main threadAndroid 应用程序在主线程上做了太多工作
【发布时间】:2018-04-24 14:32:41
【问题描述】:

我在单击按钮时调用函数processImage(),但无法获得所需的确切输出。

processImage()函数,

private void processImage() {
    TextRecognizer textRecognizer = new TextRecognizer.Builder(getApplicationContext()).build();
    if (textRecognizer.isOperational()) {
        Log.d("IMAGE-PROCESS", "started");

        Frame frame = new Frame.Builder().setBitmap(bitmap).build();
        final SparseArray<TextBlock> items = textRecognizer.detect(frame);

        runOnUiThread(new Runnable(){
            public void run() {
                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < items.size(); i++) {
                    TextBlock textBlock = items.valueAt(i);
                    stringBuilder.append(textBlock.getValue());
                    stringBuilder.append("\n");
                }
                try {
                    Log.d("IMAGE-PROCESS", "finished");
                    Log.d("OUTPUT", stringBuilder.toString());
                    textView.setText(stringBuilder.toString());
                } catch (final Exception ex) {
                    Log.i("EXC","Exception in thread");
                }
            }
        });
    } else {
        Log.d("IMAGE-PROCESS", "not operational");
    }
}

它记录

I/Choreographer:跳过了 86 帧!应用程序可能在其主线程上做了太多工作。

我需要更改我的函数中的任何内容吗? 帮我解决这个问题

【问题讨论】:

标签: android


【解决方案1】:

您需要确保 processImage 方法在后台(非 ui)线程上运行。它现在可能正在 UI 线程上运行,您会收到警告,因为它阻塞了 UI 线程。

有许多方法可以在后台线程上工作,从简单地产生一个新线程到创建一个服务 - 您需要对此进行研究,并根据您的具体情况决定最佳方法。请记住,当您的后台处理完成后,您需要将数据传输到 UI 线程,并从 UI 线程更新 UI,因为尝试从另一个线程更新会导致崩溃。

我唯一的具体建议是不要使用 AsyncTask。它们在理论上听起来很棒,但除非你真的知道它们是如何工作的,否则它们会给你带来很多麻烦。如果你真的知道它们是如何工作的,那么你完全有能力做一些更可靠的事情。

【讨论】:

    【解决方案2】:

    发布的代码在哪里?

    通常,即使在 UI 线程上完成了艰苦的工作,屏幕也会冻结/卡顿,但最终会产生所需的输出。我猜 86 个跳过的帧大约是 1.25 秒的冻结。

      1234563
    • 由于您收到此消息,并且您没有提及此重要细节,因此我假设您的代码在 UI 线程上运行。

    图像处理是一项昂贵的任务,应该在后台线程上执行。

    要做一种后台工作,你应该使用一些现成的类(例如AsyncTaskService等),或者自己创建一个(在Executors的帮助下)等)。

    了解如何做到这一点here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      相关资源
      最近更新 更多