Android VideoView按顺序启动大量视频

Otu*_*uyh 6 android android-videoview

我正在测试这个大约三天不间断.

这是简单的代码:

private VideoView videoView;
Run Code Online (Sandbox Code Playgroud)

-

videoView = (VideoView) findViewById(R.id.videoView);

videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
            getNewVideo();
        }
    }
});

getNewVideo();
Run Code Online (Sandbox Code Playgroud)

-

private void getNewVideo(){
    File file = //Any File. I have a list of files and they are executed in order
    videoView.stopPlayback();
    videoView.setVideoPath(file.getPath());
    videoView.start();
}
Run Code Online (Sandbox Code Playgroud)

-

<VideoView
    android:id="@+id/videoView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true" />
Run Code Online (Sandbox Code Playgroud)

我需要24/7执行此代码.

问题是,与持续时间无关(在开始运行或运行20分钟后),有时候,视频就会冻结.没有日志,没有例外,我唯一知道的是在冻结之前运行的最后一件事就是onPrepared().

日志与所有调用视频的尝试相同,唯一的区别是最后一次尝试(冻结的那个),只是在准备好执行后停止.

任何提示表示赞赏.

我使用的内部版本号是RKM MK902_ANDROID5.1.1-20151016.1805

使用RKM MK902II Android PC设备,在电视屏幕42'中运行

del*_*116 5

我没有太多玩本地视频文件的经验(我假设这是因为你的代码说你有"按顺序执行的文件列表"),但.....

根据我的经验videoView.start(),在VideoView正确初始化媒体之前,您不应该打电话.

当您调用videoView.setVideoPath("path")VideoView时,将执行一些初始化过程来加载Media.VideoView加载/初始化媒体后,它将调用其onPreparedListener回调(如果你设置了一个).只有当VideoView调用此回调时,才应调用VideoView.start()以开始视频播放.

所以...当你在VideoView上设置onCompletionListener时......你还应该设置一个onPreparedListener.当VideoView向您的班级报告它已准备好....呼叫VideoView.start()开始播放.

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            videoView.start();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

此外,在我的代码中,我VideoView.suspend()在重新使用VideoView播放后续视频之前拨打电话.尝试VideoView.suspend()getNewVideo()方法的开头添加一个调用.