UI冻结,同时在后台Android中执行繁重的处理

时间:2019-02-09 07:25:51

标签: android

在用户界面线程上:

   AsyncCaller asyncCaller = new AsyncCaller();
                           asyncCaller.doInBackground();

在AsyncTask中: @Override        保护的void doInBackground(Void ... params){

       Mat orignal = new Mat(image1.getHeight(), image1.getWidth(), CvType.CV_8UC3);
       Mat v_blur = new Mat(image1.getHeight(), image1.getWidth(), CvType.CV_8UC3);
       Utils.bitmapToMat(image1, orignal);
       Imgproc.GaussianBlur(orignal, v_blur, new Size(3, 3), 0);
       // blur completed
       Mat to_zero = new Mat(image1.getHeight(), image1.getWidth(), CvType.CV_8UC4);
       Imgproc.threshold(v_blur, to_zero, 100, 100, Imgproc.THRESH_TOZERO);
       Bitmap bmp = image1;
       Log.e("background", "in bg");
       Utils.bitmapToMat(bmp, to_zero);
       for (int j = 0; j < bmp.getWidth(); j++) {
           for (int i = 0; i < bmp.getHeight(); i++) {
               int pixelValue = bmp.getPixel(j, i);
               int red = Color.red(pixelValue);
               int green = Color.green(pixelValue);
               int blue = Color.blue(pixelValue);

               if (red > 10 && blue > 10 && green > 10) {
                   int led_bulb = checkForAlreadyExistance(j, i);
                   if (led_bulb == -1) {
                       int start_x = getMinValue(j);
                       int start_y = getMinValue(i);
                       int end_x = getMaxValue(j, bmp.getWidth());
                       int end_y = getMaxValue(i, bmp.getHeight());
                       Log.e("crop_values", start_x + " " + end_x + " " + start_y + " " + end_y);
                       LEDs.add(new LedBoundingBox(LED++, end_x, start_x, end_y, start_y, 0, 0, 0.0));
                   } else {
                       if (j > LEDs.get(led_bulb).inner_x_max) {
                           LEDs.get(led_bulb).inner_x_max = j;
                       }
                       if (j < LEDs.get(led_bulb).inner_x_min) {
                           LEDs.get(led_bulb).inner_x_min = j;
                       }
                       if (i > LEDs.get(led_bulb).inner_y_max) {
                           LEDs.get(led_bulb).inner_y_max = i;
                       }
                       if (i < LEDs.get(led_bulb).inner_y_min) {
                           LEDs.get(led_bulb).inner_y_min = i;
                       }

                   }

               }
           }
       }
       Log.e("bgComplete", "complete");
       return null;
   }

我正在使用Android OpenCV库进行图像处理。首先,我在UI线程上完成了所有这些工作,但是遇到了UI挂起的问题。所以我将其移至后台线程。但是我仍然面临UI挂起的问题。谁能解释为什么会发生这种情况以及任何可能的解决方案? 谢谢

3 个答案:

答案 0 :(得分:0)

在工作中使用Java线程而不是异步任务! 异步任务仅适用于小型操作。

请在此处检查: https://stackoverflow.com/a/18480297/4632620

答案 1 :(得分:0)

使用asyncCaller.execute():,不要直接调用doInBackground()

现在,您是在UI线程上调用此方法,而不是启动AsyncTask并让任务自己调用该线程。

AsyncTask任务=新的AsyncTask(); task.execute(paramsForDoInBackground);

应该怎么称呼

答案 2 :(得分:0)

最简单,最佳和直观的示例,并演示了如果您不想冻结UI时应如何精确。遇到此问题的每个人或不知道如何为android项目编码的任何人,都应该看到并遵循这种风格:

Video Demonstration of Avoiding UI freezing