2011-11-28 3 views
13

J'ai une asyncTask, où je masque une vue vidéo, démarre la lecture de la vidéo et affiche la vue vidéo lors de la lecture de la vidéo.VideoView ne démarre pas lorsqu'il est invisible

Mais la vidéo ne démarre pas lorsque la vue vidéo est définie sur invisible, la tâche asynchrone reste suspendue à l'arrière-plan. Si je commente sur cette ligne, la vidéo commence à jouer. Pourquoi la vue vidéo nécessite-t-elle une surface visible?

public void walk(final View v) { 

    new AsyncTask() { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      mVideoView.setVisibility(View.INVISIBLE); // this line causes video not to start 
      mVideoView.start(); 
     } 

     @Override 
     protected Object doInBackground(Object... objects) { 
      while (!mVideoView.isPlaying()) {} 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Object o) { 
      super.onPostExecute(o); 
      mVideoView.setVisibility(View.VISIBLE); 
     } 

    }.execute(); 

Un peu de fond pourquoi je fais ceci: J'essaie d'éviter le problème bien connu du flash noir que vous avez habituellement lors du démarrage d'une vidéo:

https://stackoverflow.com/search?q=%5Bandroid%5D+videoview+black

https://stackoverflow.com/search?q=%5Bandroid%5D+video+%5Bmediaplayer%5D+black

Répondre

10

Le VideoView est vraiment un SurfaceView spécialisé. Un SurfaceView fonctionne en créant une autre fenêtre derrière la fenêtre normale (contenant toutes les vues), puis en ayant une zone de transparence pour que la nouvelle fenêtre (avec sa propre surface de dessin) puisse être vue derrière elle.

Si un SurfaceView n'est plus visible, sa surface sera détruite, c'est-à-dire que SurfaceHolder.Callback.surfaceDestroyed est appelée. Le VideoView ne va pas essayer de lire sa vidéo s'il n'y a pas de surface valide, par conséquent votre AsyncTask ne pourra jamais quitter doInBackground.

La Surface sera créée pour vous lorsque la fenêtre SurfaceView est visible; vous devez implémenter surfaceCreated (SurfaceHolder) et surfaceDestroyed (SurfaceHolder) pour découvrir quand la surface est créée et détruite lorsque la fenêtre est affichée et masquée.