0

我正在寻找一种解决方案,将来自不同 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;
}

}

有谁知道,是什么导致了这种行为或我在哪里犯了错误?

4

1 回答 1

1

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

当视图是当前也处于活动状态的 XML 布局的一部分时,似乎 Android 只预加载了 VideoViews 视频。因此,如果您想预加载视频,请将 videoview 作为 xml 的一部分,并且不要使用构造函数创建 videoview-object,就像我所做的那样。然后它应该工作!:D

于 2013-09-18T14:57:44.510 回答