我创建了 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);
}
};
我只想让这段代码有效运作。
答案 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。
或者就像在评论中说的那样,您可以查看ThreadPoolExecutor
和this tutorial。