我正在寻找一种解决方案,将来自不同网址的一些视频预加载到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;
}
}
有人知道,是什么导致了这种行为或我犯了错误的地方?
答案 0 :(得分:1)
终于解决了我的问题。对于所有感兴趣的人来说,这是答案:
当视图是XML-Layout的一部分时,似乎Android只预加载VideoViews视频,而XML-Layout当前也是活动的。因此,如果您想要预加载视频,请将视频视图作为xml的一部分,并且不要使用构造函数创建videoview-object,就像我已经完成的那样。 那它应该工作! :d