Android LogCat 显示 BufferQueueProcedure

Android LogCat shows BufferQueueProcedure

首先请原谅我的英语不好。我有我的应用程序(学校作业)的最终版本 - 它正在拍照,然后使用 C++ 代码拼接照片。我在 phone Xperia mini API 15 上测试了该应用程序,在此设备上一切正常。但是我借了学校的Nexus 5 API 21 有两个问题

第一个问题令人沮丧。今天调试了一整天都没有解决。我不知道哪部分代码会出现这个错误。每当应用程序 运行 - 无论是拍照还是拼接,LogCat 都会显示数千个这样的错误:

Tag: BufferQueueProceducer Text: [unnamed-3046-0] dequeueBuffer: Bufferqueue has been abandoned

此错误后代码停止。不幸的是我可以更具体,因为我不知道。原因可能在哪里。

第二个问题只是在拼接照片的过程中,突然出现Application not responding (ANR)。但是当我点击等待时,应用程序继续拼接照片。结果很好,但对话框很烦人。 我在此页面上找到了解决方案 - 问题出在运行时环境 ART 中。我想将运行时环境从 ART 更改为 Dalvik,但 Nexus 5 没有更改选项。还有其他选择吗? LogCat 中的错误:

Tag: art  Thread[5,tid=6270, `WaitingInMainSignalCatcherLoop,Thread*=0xf60e40,peer=0x12c00080,"Signal Catcher"]: reacting to signal 3`

谢谢你的每一个建议,LS

我正在简化代码(这是主要部分),因此您可以轻松分析,但是如果您愿意,我可以在此处编写所有代码。

// button for stitching photo in folder 'img'
public void onlyStitchButtonClicked(View button)
{
    File root = new File(urlStorage + "img");
    if (!root.exists()){
        toaster("Folder '" + urlStorage + "img' doesnt exist");
    }else{
        // show message on TextView
        tOutput.append("Stitching.\n");
        choosenResultSize = getUsersSize();

        // without delay text dont show in TextView
        new Handler().postDelayed(new Runnable() {
            public void run() {
                Stitching(urlStorage, "img", choosenResultSize);
                tOutput.append("End stitching.\n");
            }
        }, 500);        
    }
    return;
}

// Button for taking photo and stitching them
public void startButtonClicked(View button){
    // Get users settings

    tOutput.setText("App is running. Start taking photo.\n");

    // Wait delay before taking first photo
    new Handler().postDelayed(new Runnable() {
        public void run() {
            StartShot();
        }
    }, DelayBeforeStart*1000);
}

// Take collection of photos
private void StartShot(){
    new CountDownTimer(((1+NumOfPhoto)*DelayBetweenShot)*1000, DelayBetweenShot*1000) {
        private int Photo = 0;

        @Override
        public void onTick(long millisUntilFinished) {
            tOutput.append("Photo num. " + ++Photo );

            try{
                camera.takePicture(null, null, mPicture);
            }
            catch(Exception e){}
        }

        @Override
        public void onFinish() {
            tOutput.append("Stop taking photo. Start stitching");
            // Wait delay before taking first photo
            new Handler().postDelayed(new Runnable() {
                public void run() {
                    Stitching(urlStorage, FolderName, choosenResultSize);

                    tOutput.append("Stitching done.");
                    scrollview.fullScroll(ScrollView.FOCUS_DOWN);
                }
            }, 500);
        }

    }.start();
}

问题 #1:

BufferQueues 是 Surfaces 的底层机制,具有生产者-消费者安排。对于 SurfaceView,您的应用是生产者,SurfaceFlinger(系统图形合成器)是消费者。对于 SurfaceTexture,两面都在您的应用程序中。 "BufferQueue has been abandoned" 消息意味着消费者端已经消失,例如您正在尝试将帧发送到 SurfaceView 的 Surface,但 SurfaceView 已不存在。

我的猜测是,您用于相机输出的任何表面都已被丢弃,每次相机尝试发送预览图像时,您都会收到一条错误消息。

问题 #2:

听起来您正在 UI 主线程上做大量工作。这会导致系统认为应用程序没有响应,并且您会看到 ANR 对话框。部分 ANR 处理涉及从无响应进程获取堆栈跟踪;因为它不能通过通常的方式询问,所以它发送了一个信号 3。来自 VM 的消息只表明收到了信号 3。切换到 Dalvik 不太可能改变事情。

在非 UI 线程上执行照片拼接,并确保 UI 线程没有等待其他线程完成。 AsyncTask 在这里很有用。