VideoView не запускается, когда невидимый
У меня есть AsyncTask, где я скрываю вид видео, запускаю воспроизведение видео и показываю видеоролик, когда воспроизводится видео.
Но видео просто не запустится, когда видеоизображение будет установлено на невидимое, асинхронная задача будет зависеть от 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
Ответы
Ответ 1
VideoView
действительно является специализированным SurfaceView. SurfaceView работает, создавая другое окно за нормальным окном (содержащее все представления), а затем обладая прозрачностью, чтобы за ним можно было увидеть новое окно (с его собственной поверхностью рисования).
Если SurfaceView больше не виден, его поверхность будет уничтожена, т.е. вызывается SurfaceHolder.Callback.surfaceDestroyed
. VideoView
не будет пытаться воспроизводить свое видео, если не существует допустимой поверхности, поэтому ваш AsyncTask
не сможет оставить doInBackground
.
Поверхность будет создана для вас, пока отображается окно SurfaceView; вы должны реализовать surfaceCreated (SurfaceHolder) и surfaceDestroyed (SurfaceHolder), чтобы обнаружить, когда Поверхность создается и уничтожается при показе и скрытии окна.