2011-11-28 13 views
13

Tengo una AsyncTask, donde oculto una vista de video, inicio la reproducción de video y muestra la vista de video cuando se reproduce el video.VideoView no se inicia cuando es invisible

Pero el video simplemente no se iniciará cuando la vista del video esté configurada como invisible, la tarea asincrónica sigue colgando enBackground. Si comento esta línea, el video comienza a reproducirse. ¿Por qué la vista de video requiere una superficie 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 poco de historia por qué estoy haciendo esto: Trato de evitar el problema bien conocido de que el flash negro que por lo general tienen al iniciar un vídeo:

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

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

Respuesta

10

La VideoView es realmente una especializada SurfaceView. Un SurfaceView funciona al crear otra ventana detrás de la ventana normal (que contiene todas las vistas) y luego tiene un área de transparencia para que la nueva ventana (con su propia superficie de dibujo) se pueda ver detrás de ella.

Si un SurfaceView ya no está visible, su superficie se destruirá, es decir, se llamará SurfaceHolder.Callback.surfaceDestroyed. El VideoView no intentará reproducir su video si no hay una superficie válida, por lo tanto, su AsyncTask nunca podrá salir de doInBackground.

La superficie se creará para usted mientras la ventana de SurfaceView esté visible; debe implementar surfaceCreated (SurfaceHolder) y surfaceDestroyed (SurfaceHolder) para descubrir cuándo se crea y se destruye la superficie, ya que la ventana se muestra y se oculta.

Cuestiones relacionadas