Я хочу воспроизводить видео в своих элементах RecyclerView, вроде Instagram. За один раз расширяется только один элемент, поэтому видео не нужно воспроизводить одновременно.
Я сейчас использую ExoPlayer. У меня есть PlayerView внутри моего предмета для RecyclerView.
Проблема в том, что у проигрывателя у меня плохая производительность, что очень плохо при прокрутке и расширении. Performany уже плох в том, что в проигрывателе просто есть проигрыватель без загрузки и воспроизведения видео, но с загрузкой он становится еще хуже.
Я тоже пробовал VideoView, но это, похоже, не имеет большого значения.
Для достижения лучшей производительности я уже делаю:
recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(10);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
adapter.hasStableIds();
Это немного помогает, но не решает проблему производительности.
Есть идеи, в чем может быть проблема? Я ценю и мысли.
EDIT:
это метод, которым я настраиваю ExoPlayer:
public void showTutuorItems(Context context, Boolean show, String resource) {
if (show) {
seperator.setVisibility(View.VISIBLE);
lytTutor.setVisibility(View.VISIBLE);
playerView = itemView.findViewById(R.id.exoPlayer);
playerView.setUseController(false);
playerView = itemView.findViewById(R.id.exoPlayer);
playerView.setUseController(false);
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(context),
new DefaultTrackSelector(), new DefaultLoadControl());
playerView.setPlayer(player);
player.setPlayWhenReady(true);
player.seekTo(0, 0);
player.setRepeatMode(Player.REPEAT_MODE_ALL);
player.setVolume(0);
Uri uri = Uri.parse(resource);
MediaSource mediaSource = buildMediaSource(uri);
player.prepare(mediaSource, true, false);
player.addListener(new Player.EventListener() {
//...
}
} else {
seperator.setVisibility(View.GONE);
lytTutor.setVisibility(View.GONE);
}
}
private MediaSource buildMediaSource(Uri uri) {
return new ExtractorMediaSource.Factory(
new DefaultHttpDataSourceFactory("exoplayer-codelab")).
createMediaSource(uri);
}
и это в моем OnCreateViewHolder для вызова этого метода:
if (workout.getCurrentExercsise().getTutor() != null) {
holder.showTutuorItems(activity, true, workout.getCurrentExercsise().getTutor().getItems().get(0).getResource());
} else {
holder.showTutuorItems(activity, false, null);
}
В моем OnBindViewHolder есть некоторый пользовательский интерфейс и функция расширения / свертывания. Это не должно вызывать проблемы, потому что без ExoPlayer все работает просто отлично.