2013-09-12 4 views
0

Я ищу решение для предварительной загрузки некоторых видеороликов с разных 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; 
} 

}

Кто-нибудь знает, что вызывает такое поведение или где я допустил ошибку?

ответ

1

Наконец-то решена моя проблема. Для всех, кому интересно, ответит:

Кажется, что Android только предварительно загружает видео VideoViews, когда представление является частью XML-макета, который также в настоящее время активен. Поэтому, если вы хотите предварительно загрузить видео, сделайте часть видеообзора вашего xml и не создавайте объект видеовидео с конструктором, как я это сделал. Тогда это должно сработать! : D

+0

hmm ... у вас есть 'mVideoView.start();' in 'doInBackground', который может вызвать проблему, когда она действительно должна быть вызвана в основном потоке. –