web-dev-qa-db-ja.com

BufferQueueが放棄された場合、何ができますか?

テクスチャビューを使用して、Androidアプリでカメラのプレビューを表示しています。しかし、気づいたのは、アプリが一時停止されるたびに、このエラーが発生することです。

_03-18 18:23:44.315: W/BufferQueue(19582): [unnamed-19582-20] cancelBuffer: BufferQueue has been abandoned!
_

ここで何が起こっているのか教えてもらえますか?アプリが一時停止するときは、onSurfaceTextureDestroyed()からこのようなすべてを初期化解除します

_ public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
    mCamera.setPreviewCallback(null);
    mCamera.stopPreview();
    mCamera.release();
    return true;
}
_
27
user2426316

あなたがやっているのは、基本的に TextureView docs に書かれていることなので、動作するはずです。

このエラーメッセージは、BufferQueue(カメラ)の「プロデューサー」側がバッファーを取得し、(cancelBuffer()を介して)取得しようとしていることを意味します。ただし、「消費者」側(SurfaceTexture)はなくなりました。 「消費者」側がキューを所有しているため、BufferQueueは破棄されたと見なされ、それ以上の操作はできません。

これは単なるタイミングの問題のように思えます。プロデューサーはSurfaceTextureが破壊された後に操作を行おうとしています。 onSurfaceTextureDestroyed()でプロデューサーをシャットダウンしているため、そのコールバックがtrueを返さない限り、STはリリースされないため、これは意味がありません。 (コールバックメソッドの最初と最後にログメッセージを追加し、それらの前または後に「放棄された」苦情が発生するかどうかを確認することは興味深いかもしれません。logcat -v threadtimeスレッドIDを表示します。)

だから私はなぜこれが起こっているのか本当に分かりません。良いニュースは、アプリケーションに悪影響を与えてはならないことです。プロデューサーは、コンシューマーがなくなったことを正しく判断し、文句を言いますがクラッシュしません。うるさいですが、爆発的ではありません。

好奇心から、「 Grafika 」で「Live camera(TextureView)」を実行すると、デバイスからこのようなメッセージが表示されますか?そのアクティビティはTextureViewドキュメントから直接出ており、デバイスで実行しても苦情はありません。

(SurfaceTextureとBufferQueueに関する追加情報は here にあります。)

45
fadden