web-dev-qa-db-fra.com

Que puis-je faire lorsque BufferQueue a été abandonné?

J'utilise une vue de texture pour afficher l'aperçu de la caméra dans mon Android. Ce que j'ai remarqué, cependant, c'est que chaque fois que mon application est mise en pause, j'obtiens cette erreur:

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

Quelqu'un peut-il me dire ce qui se passe ici? Lorsque mon application se met en pause, tout ce que je fais est de tout réinitialiser comme ceci à partir de onSurfaceTextureDestroyed()

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

Ce que vous faites est essentiellement ce qui est écrit dans les TextureView docs , donc cela devrait fonctionner.

Le message d'erreur signifie que le côté "producteur" du BufferQueue (la caméra) a récupéré un tampon et essaie maintenant de le dés-récupérer (via cancelBuffer()). Cependant, le côté "consommateur" (le SurfaceTexture) a disparu. Étant donné que le côté "consommateur" possède la file d'attente, le BufferQueue est considéré comme abandonné et aucune autre opération n'est possible.

Cela semble être juste un problème de timing - le producteur essaie de faire des opérations après que le SurfaceTexture a été détruit. Ce qui n'a pas de sens, car vous fermez le producteur dans onSurfaceTextureDestroyed(), et la ST n'est pas libérée à moins que et jusqu'à ce que ce rappel renvoie true. (Il peut être intéressant d'ajouter des messages de journal au début et à la fin de la méthode de rappel et de voir si la plainte "abandonnée" se produit avant ou après eux. Utilisez logcat -v threadtime pour voir les ID de threads.)

Je ne sais donc pas vraiment pourquoi cela se produit. La bonne nouvelle est que cela ne devrait pas nuire à votre demande - le producteur déterminera correctement que le consommateur est parti et se plaindra mais ne plantera pas. C'est donc bruyant mais pas explosif.

Par curiosité, voyez-vous des messages comme celui-ci depuis votre appareil si vous exécutez "Caméra en direct (TextureView)" dans Grafika ? Cette activité est directement sortie des documents TextureView, et je ne vois aucune plainte lorsque je l'exécute sur mon appareil.

(Des informations supplémentaires sur SurfaceTexture et BufferQueue peuvent être trouvées ici .)

45
fadden