Что делать, если 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;
}

Ответ 1

Что вы делаете, это то, что написано в Документах TextureView, поэтому оно должно работать.

Сообщение об ошибке означает, что сторона "производителя" BufferQueue (камера) захватила буфер и теперь пытается ее не захватывать (через cancelBuffer()). Однако сторона "потребителя" (SurfaceTexture) исчезла. Поскольку "потребительская" сторона владеет очередью, BufferQueue считается заброшенной, и дальнейшие операции невозможны.

Это звучит как проблема времени - производитель пытается выполнять операции после того, как SurfaceTexture был уничтожен. Это не имеет смысла, потому что вы закрываете производителя в onSurfaceTextureDestroyed(), и ST не освобождается, пока и пока этот обратный вызов не вернет true. (Возможно, было бы интересно добавить сообщения журнала в начале и в конце метода обратного вызова и посмотреть, есть ли "оставленная" жалоба до или после них. Используйте logcat -v threadtime, чтобы увидеть идентификаторы потоков.)

Так что я не совсем уверен, почему это происходит. Хорошей новостью является то, что она не должна отрицательно влиять на ваше приложение - производитель правильно определит, что потребитель ушел, и будет жаловаться, но не терпеть крах. Поэтому он шумно, но не взрывается.

Из любопытства вы видите такие сообщения с вашего устройства, если вы запустите "Live camera (TextureView)" в Grafika? Эта деятельность прямо из документов TextureView, и я не вижу никаких жалоб при запуске на моем устройстве.

(Дополнительную информацию о SurfaceTexture и BufferQueue можно найти здесь.)