RecyclerView 与 ExoPlayer/VideoView 性能不佳

Jon*_*nas 5 android android-videoview exoplayer

我想在我的 RecyclerView 项目中播放视频,有点像 Instagram。一次仅展开一个项目,因此不必同时播放视频。

我目前正在使用 ExoPlayer。我的 RecyclerView 项目中有一个 PlayerView。

问题是,对于播放器,我的性能很差,在滚动和扩展时非常糟糕。仅在项目中包含播放器而不加载和播放视频,Performany 已经很糟糕,但加载它会变得更糟。

我也尝试过VideoView,但似乎没有太大区别。

为了获得更好的性能,我已经这样做了:

recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(10);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
adapter.hasStableIds();
Run Code Online (Sandbox Code Playgroud)

这有一点帮助,但它并不能解决性能问题。

知道问题是什么吗?我欣赏并思考。

编辑:

这是我设置 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);
    }
Run Code Online (Sandbox Code Playgroud)

这是在我的 OnCreateViewHolder 中调用此方法:

if (workout.getCurrentExercsise().getTutor() != null) {
        holder.showTutuorItems(activity, true, workout.getCurrentExercsise().getTutor().getItems().get(0).getResource());
    } else {
        holder.showTutuorItems(activity, false, null);
    }
Run Code Online (Sandbox Code Playgroud)

在我的 OnBindViewHolder 中是一些 UI 内容并处理展开/折叠功能。这不会导致问题,因为如果没有 ExoPlayer,它也能正常工作。