0

我在 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);
    }
}

在 Fragment 中,这是释放方法,在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;
}

当应用程序达到 ~120MB 时,hprof 文件的快照: 在此处输入图像描述

在此处输入图像描述

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

4

0 回答 0