Как заставить темы работать в серии

Я создал CameraApp. И получать byte[] cameraPreviewCallback в onPreviewFrame(byte byteArray[] , Camera camera)

Я конвертирую эти byteArray в rgb и делать много вещей тоже. Так что работает медленно. Поэтому я думаю, что я должен получить выгоду от java.util.concurrent пакет. Но не нашел простой способ справиться с тем, что я хочу.

Я хочу, чтобы несколько потоков выполняли свою работу последовательно, но каждый раз можно установить bitmap в surfaceView, А также должны проверить, что:

No Old byte of Array shouldn't be draw on surfaceView.

Я думаю, что я должен написать этот код с помощью блокировки синхронизации. И проверить булеву переменную isWorkingOnFrame является true,

Может кто-нибудь объяснить мне, как использовать несколько потоков в серии, но в одно время можно сделать свою работу.

private android.hardware.Camera.PreviewCallback previewCallback = new android.hardware.Camera.PreviewCallback()
    {
        public void onPreviewFrame(byte abyte0[] , Camera camera)
        {   
            try
            {
               Thread.sleep(1L);
            }
            catch (InterruptedException interruptedexception)
            {
                return;
            }

            int[] rgbData =  YuvUtils.myDecodeGreyscale(abyte0, widthPreview, heightPreview, imageBrightness, nonGreencolorOffset, greenColorOffset);  ///it is working...

            editedBitmap.setPixels(rgbData, 0, widthPreview, 0, 0, widthPreview, heightPreview);

            if(CameraStatik.cameraId==CameraInfo.CAMERA_FACING_FRONT)
            {   
                matrix.setRotate(270F);
            }

            finalBitmap = Bitmap.createBitmap(editedBitmap, 0, 0, widthPreview, heightPreview, matrix, true);

            if(saveCurrentFrame)
            {
                saveCurrentFrame =false;

                new BitmapSaver(ctx, finalBitmap).start();
            }

            drawView.setBitmapToDraw(finalBitmap);
        }
    };

Я просто хочу, чтобы этот код работал эффективно.

1 ответ

Решите это Java-способом! Использовать Executor интерфейс вместе с Runnable,

Во-первых, получить ExecutorService (который реализует Executor интерфейс с Executors.newSingleThreadExecutor(), а затем, чтобы ваши темы работали.

Пример:

public YourClass extends Activity {
    // Other methods like onCreate() variable declarations and so on.
    // ...

    private void runOnThread() {
        Executor exe = Executors.newSingleThreadExecutor();
        exe.execute(new Runnable() { 
            public void run() { 
                // Do whatever you want to do.
            } 
        });
    }
    // Other methods...
    // ...
}

Вы можете прочитать больше о Executor здесь

Или, как было сказано в комментариях, вы можете посмотреть на ThreadPoolExecutor и на этом уроке.

Другие вопросы по тегам