VideoView не запускается, когда невидим - PullRequest
13 голосов
/ 28 ноября 2011

У меня есть 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 Ответ

10 голосов
/ 17 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...