Android VideoView没有';看不见时不要启动

Android VideoView没有';看不见时不要启动,android,android-asynctask,android-videoview,android-mediaplayer,Android,Android Asynctask,Android Videoview,Android Mediaplayer,我有一个异步任务,在这里我隐藏视频视图,开始视频播放,并在视频播放时显示视频视图 但是当视频视图设置为不可见时,视频就不会启动,异步任务一直挂在后台。如果我把这行注释掉,视频就会开始播放。 为什么视频视图需要一个可见的表面 public void walk(final View v) { new AsyncTask() { @Override protected void onPreExecute() { super.onPreE

我有一个异步任务,在这里我隐藏视频视图,开始视频播放,并在视频播放时显示视频视图

但是当视频视图设置为不可见时,视频就不会启动,异步任务一直挂在后台。如果我把这行注释掉,视频就会开始播放。 为什么视频视图需要一个可见的表面

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();
我这样做的一点背景:我尽量避免在开始视频时出现众所周知的黑色闪光问题:


视频视图确实是一个专业的。SurfaceView的工作原理是在普通窗口(包含所有视图)后面创建另一个窗口,然后创建一个透明区域,以便可以在其后面看到新窗口(具有自己的绘图曲面)

如果表面视图不再可见,其表面将被销毁,即调用
SurfaceHolder.Callback.surfaceDestroyed
。如果没有有效的表面,
VideoView
将不会尝试播放其视频,因此您的
AsyncTask
将永远无法离开
doInBackground

当SurfaceView的窗口可见时,将为您创建曲面;您应该实现surfaceCreated(SurfaceHolder)和surfaceDestroyed(SurfaceHolder),以便在显示和隐藏窗口时发现曲面的创建和销毁时间