如何使线程在

时间:2015-08-12 13:34:48

标签: android multithreading android-camera previewcallback

我创建了 CameraApp 。并在byte[]

中获取onPreviewFrame(byte byteArray[] , Camera camera) cameraPreviewCallback

我正在将这些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 个答案:

答案 0 :(得分:1)

以java方式解决它!使用Executor界面和Runnable

首先,使用ExecutorService获取Executors.newSingleThreadExecutor()(实现Executor接口),然后使用线程工作。

示例:

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 here

或者就像在评论中说的那样,您可以查看ThreadPoolExecutorthis tutorial