在ImageReader.OnImageAvailableListener中执行时,线程代码未完成

时间:2019-09-11 21:02:20

标签: android multithreading android-camera2

基本上,我要完成的工作是将摄像机的视图预览到屏幕上,然后对线程中可用的每个图像执行一些背景处理。

我尝试依次运行下面的代码(没有线程),该代码可以正常工作,但是由于进行了大量的处理,相机开始出现很多卡顿现象。一旦将处理代码放在线程上,摄像头就会再次平稳运行,但是该线程永远不会完成其功能(其处理不会提供任何输出)。奇怪的是,当我一一调试线程(调试它们好像是顺序的)时,代码确实会提供其处理的输出。

private final ImageReader.OnImageAvailableListener imageAvailableListener =
            new ImageReader.OnImageAvailableListener() {

                @Override
                public void onImageAvailable(ImageReader reader) {
                    Log.d(LOG_TAG, "Image frame available.");

                    final Image image = reader.acquireLatestImage();

                    if (image == null) return;

                    final byte[] imageBytes = ImageUtil.imageToByteArray(image);

                    image.close();

                    if (frameProcessingLock.tryAcquire()) {
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                Log.d(LOG_TAG, "Performing image processing.");

                                //Perform processing here - output that it is complete

                                frameProcessingLock.release();
                            }
                        }).start();
                    }
                }
            };

我使用了一个信号量“ frameProcessingLock”来确保读取器一次只处理一个图像(仅一个就足够了)-如果线程仍然很忙,它将跳过下一个图像的处理。这就是使相机继续平稳运行的原因。我有一种尝试使用线程的感觉吗?不太确定,但是任何帮助将不胜感激。

0 个答案:

没有答案