RecyclerView与ExoPlayer / VideoView糟糕的性能

时间:2018-05-06 17:47:48

标签: 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();

这有点帮助,但它无法解决性能问题。

任何想法可能是什么问题?我很感激和想法。

编辑:

这是我设置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中有一些UI东西并处理展开/折叠功能。这不应该导致问题,因为没有ExoPlayer它可以正常工作。

0 个答案:

没有答案