2011-11-28 2 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의 창이 표시되어있는 동안 표면이 생성됩니다. SurfaceCreated (SurfaceHolder)와 surfaceDestroyed (SurfaceHolder)를 구현하여 Surface가 생성되고 파기되는 시점을 발견하고 창을 표시하거나 숨길 때 발견해야합니다.

관련 문제