Android在AsyncTask中预加载VideoViews

时间:2013-09-12 16:05:57

标签: android android-asynctask android-videoview preload prepare

我正在寻找一种解决方案,将来自不同网址的一些视频预加载到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;
}

}

有人知道,是什么导致了这种行为或我犯了错误的地方?

1 个答案:

答案 0 :(得分:1)

终于解决了我的问题。对于所有感兴趣的人来说,这是答案:

当视图是XML-Layout的一部分时,似乎Android只预加载VideoViews视频,而XML-Layout当前也是活动的。因此,如果您想要预加载视频,请将视频视图作为xml的一部分,并且不要使用构造函数创建videoview-object,就像我已经完成的那样。 那它应该工作! :d