我正在寻找一种解决方案,将来自不同 url 的一些视频预加载到 VideoViews 中,以便可以毫无延迟地播放它们。我正在尝试在异步任务中执行此操作:
class VideoPreloadTask extends AsyncTask<String, Void, Void> {
private Context mContext;
private CustomVideoView mVideoView;
public VideoPreloadTask(Context context) {
mContext = context;
}
@Override
public void onPreExecute() {
mVideoView = new CustomVideoView(mContext);
}
@Override
protected Void doInBackground(String... params) {
final String url = params[0];
mVideoView.setVideoPath(url);
mVideoView.setOnPreparedListener(new OnPreparedListener() {
//Wird aufgerufen, wenn das Video fertig geladen ist
@Override
public void onPrepared(MediaPlayer mp) {
mCounter++;
mVideoView.pause();
mVideoView.setPreloaded(true);
//Fuege das fertig geladene Video der Liste hinzu
mVideos.put(url, mVideoView);
}
});
mVideoView.start();
return null;
}
}
现在在 doInBackground-Method 中设置路径 Url 并使用 start() 开始加载视频。但是 onPrepare-Listener 不起作用。该函数永远不会被调用,我不明白为什么。我尝试在异步任务之外加载一些视频,效果很好。
异步任务是这样启动的:
for(String url : videoUrls) {
VideoPreloadTask task = new VideoPreloadTask(context);
task.execute(url);
}
我的 CustomVideoView-Class 如下所示:
public class CustomVideoView extends VideoView {
private boolean mPreloaded = false;
private String mPath = "";
public CustomVideoView(final Context context) {
super(context);
}
public CustomVideoView(final Context context, final AttributeSet set) {
super(context, set);
}
@Override
public void setVideoPath(String url) {
super.setVideoPath(url);
mPath = url;
}
public boolean isPreloaded() {
return mPreloaded;
}
public void setPreloaded(boolean isPreloaded) {
mPreloaded = isPreloaded;
}
public String getVideoPath() {
return mPath;
}
}
有谁知道,是什么导致了这种行为或我在哪里犯了错误?