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