隐藏时,VideoView无法启动

时间:2011-11-28 04:08:13

标签: android android-asynctask android-videoview android-mediaplayer

我有一个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 个答案:

答案 0 :(得分:10)

VideoView实际上是一个专门的SurfaceView。 SurfaceView的工作原理是在普通窗口后面创建另一个窗口(包含所有视图),然后有一个透明区域,以便在它后面可以看到新窗口(有自己的绘图表面)。

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

  

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