VideoView не запускается, когда невидимый

У меня есть AsyncTask, где я скрываю вид видео, запускаю воспроизведение видео и показываю видеоролик, когда воспроизводится видео.

Но видео просто не запустится, когда видеоизображение будет установлено на невидимое, задача async будет висит в 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

Solutions Collecting From Web of "VideoView не запускается, когда невидимый"

VideoView – это действительно специализированный SurfaceView . SurfaceView работает, создавая другое окно за нормальным окном (содержащее все представления), а затем обладая прозрачностью, чтобы за ним можно было увидеть новое окно (со своей поверхностью рисования).

Если SurfaceView больше не виден, его поверхность будет уничтожена, то есть SurfaceHolder.Callback.surfaceDestroyed . VideoView не будет пытаться воспроизводить его видео, если не существует допустимой поверхности, поэтому ваша AsyncTask сможет никогда не покидать doInBackground .

Поверхность будет создана для вас, пока будет открыто окно SurfaceView; Вы должны реализовать surfaceCreated (SurfaceHolder) и surfaceDestroyed (SurfaceHolder), чтобы обнаружить, когда Поверхность создается и уничтожается при показе и скрытии окна.