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