对ExoPlayerImplInternal的引用会导致RAM的使用过多

时间:2017-06-06 18:55:13

标签: android exoplayer android-memory exoplayer2.x

我在ViewPager中的每个片段中都有两个ExoPlayer实例。 在刷了很多次之后,应用程序达到~120MB的RAM,并开始运行非常慢。我从来没有得到过OutOfMemoryException。

看一下hprof文件,我看到有37个ExoPlayerImplInternal实例,即使我确保每次Fragment在onDestroy()onDetach()中销毁其视图时都正确释放它onDestroyView()

这是我初始化播放器的方式:

public void initPlayer(Context context) {
    initProxy(context);

    if (player == null) {
        DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelection.Factory videoTrackSelectionFactory =
                new AdaptiveTrackSelection.Factory(bandwidthMeter);
        TrackSelector trackSelector =
                new DefaultTrackSelector(videoTrackSelectionFactory);

        // 2. Create the player
        player = ExoPlayerFactory.newSimpleInstance(context, trackSelector);

        final LoopingMediaSource loopingSource = new LoopingMediaSource(mediaSource(videoUrl));

        player.prepare(loopingSource);
        player.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
    }
}

在片段中,这是发布方法,在onDestroy()onDetach()onDestroyView()中调用:

public void release() {
    if (player != null) {
        player.removeListener(playerEventListener);
        player.stop();
        player.release();
        player = null;
    }
    setPlayerPlaying(false);
    if (simpleExoPlayerView != null) {
        simpleExoPlayerView.setPlayer(null);
        simpleExoPlayerView = null;
    }
    playerEventListener = null;

    removeExoPlayerLayout();

    if (uiProgressHandler != null) {
        uiProgressHandler.removeCallbacks(uiProgressRunner);
        uiProgressHandler.removeCallbacks(null);
        uiProgressHandler = null;
    }
    uiProgressRunner = null;
    handler = null;
    listener = null;

    released = true;
}

当app达到~120MB时,hprof文件的快照: enter image description here

enter image description here

我有点迷失在那里我可以保留对所有这些实例的引用,因为在ViewPager中,唯一初始化的玩家是可见的一个和两个相邻的碎片。

0 个答案:

没有答案