RecyclerView с ExoPlayer / VideoView плохая производительность - PullRequest
0 голосов
/ 06 мая 2018

Я хочу воспроизводить видео в своих элементах 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 все работает просто отлично.

...