2011-11-28 10 views
13

ビデオ再生中にビデオビューを非表示にし、ビデオ再生を開始し、ビデオビューを表示するAsyncTaskがあります。インビジブル時にVideoViewが起動しない

ビデオビューが非表示に設定されているときにビデオが開始されないだけで、非同期タスクはonBackgroundにハングアップし続けます。この行をコメントアウトすると、動画が再生されます。 ビデオビューでが表示されるのはなぜですか?表面?

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(); 

私はこれをやっている理由は、背景のビット:私はビデオを開始するとき、あなたが通常持っている黒のフラッシュのよく知られた問題を回避しよう:

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

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

答えて

10

VideoViewは、実際にはSurfaceViewに特化しています。 SurfaceViewは、通常のウィンドウ(すべてのビューを含む)の背後に別のウィンドウを作成し、新しいウィンドウ(独自の描画面を持つ)がその背後に表示されるように透明領域を持っています。

SurfaceViewが表示されなくなった場合、表面が破壊されます。つまり、SurfaceHolder.Callback.surfaceDestroyedが呼び出されます。有効なサーフェスがない場合、VideoViewはそのビデオを再生しようとしません。そのため、AsyncTaskは決してdoInBackgroundを残すことができません。

SurfaceViewのウィンドウが表示されている間にSurfaceが作成されます。 SurfaceCreated(SurfaceHolder)とsurfaceDestroyed(SurfaceHolder)を実装して、サーフェスの作成時と破棄時にウィンドウが表示され、非表示になったときを検出する必要があります。

関連する問題