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 在这里很有用。
首先请原谅我的英语不好。我有我的应用程序(学校作业)的最终版本 - 它正在拍照,然后使用 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 在这里很有用。