Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

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

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