Я ищу решение для предварительной загрузки некоторых видеороликов с разных URL-адресов в VideoViews, чтобы их можно было играть без каких-либо задержек. Я пытаюсь сделать это в задаче асинхронной:Android preload VideoViews в AsyncTask
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-методе я установить путь Url и начать загрузку видео с началом(). Но onPrepare-Listener не работает. Функция никогда не вызвана, и я не понимаю, почему. Я попытался загрузить несколько видеороликов вне задачи async, и он работает хорошо.
Асинхронных задачи запускаются следующим образом:
for(String url : videoUrls) {
VideoPreloadTask task = new VideoPreloadTask(context);
task.execute(url);
}
и мой CustomVideoView-класс выглядит следующим образом:
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;
}
}
Кто-нибудь знает, что вызывает такое поведение или где я допустил ошибку?
hmm ... у вас есть 'mVideoView.start();' in 'doInBackground', который может вызвать проблему, когда она действительно должна быть вызвана в основном потоке. –