2011-11-28 12 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)來發現當窗口被顯示和隱藏時Surface被創建和銷燬的時間。