Как заставить темы работать в серии
Я создал 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
и на этом уроке.