Android 如何使线程串联工作

Android 如何使线程串联工作,android,multithreading,android-camera,previewcallback,Android,Multithreading,Android Camera,Previewcallback,我已经创建了一个CameraApp。并在预览帧(byte byteArray[],Camera Camera) 我正在将这些byteArray转换为rgb,并做了很多工作。因此,它正在缓慢地工作。所以我认为我应该从java.util.concurrent包中获益。但是没有找到一个简单的方法来处理我想要的 我希望多个线程连续执行我的工作,但每次都可以将bitmap设置为surfaceView。还必须检查: No Old byte of Array shouldn't be draw on surf

我已经创建了一个CameraApp。并在预览帧(byte byteArray[],Camera Camera)

我正在将这些
byteArray
转换为
rgb
,并做了很多工作。因此,它正在缓慢地工作。所以我认为我应该从
java.util.concurrent
包中获益。但是没有找到一个简单的方法来处理我想要的

我希望多个线程连续执行我的工作,但每次都可以将
bitmap
设置为
surfaceView
。还必须检查:

No Old byte of Array shouldn't be draw on surfaceView.
我想我必须使用同步锁来编写代码。并检查布尔变量
isWorkingOnFrame
is
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);
        }
    };

我只是想让这段代码高效地工作。

用java的方式解决它!使用界面时,请同时使用

首先,获取一个(实现
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...
    // ...
}
您可以阅读有关执行器的更多信息


或者像评论中说的那样,你可以看一看再看。

1个字给你——我有两个问题。您的代码创建了多少线程,它们并行或串行工作。您可以创建任意数量的线程。他们将一次一个地工作。他们将被排成一列。一旦一个完成工作,队列中的下一个将开始工作。我如何处理调用setBitmap。假设一次创建十个线程。任何假设(第三个线程)绘制位图,2秒后线程5调用setBitmap(它可能保存了旧的字节集,我如何处理它。如果创建10个线程,它们一次只能工作一个,因此不会同时调用
setBitmap()
method。还要注意的是,如果10个线程要以串行方式执行任务,那么创建10个线程是没有意义的……只需要一个额外的线程就可以了。