【发布时间】:2018-03-22 21:37:03
【问题描述】:
我正在使用带有单个片段实例的ViewPager,其中我正在显示Media 文件,如图像、视频、音频。
我已经实现了ExoPlayer 来处理Video 和Audio 文件。和Glide 用于图像。
为了避免内存泄漏,我在ItemViewerFragment.java 中像这样释放ExoPlayer 对象:
private void releasePlayer() {
if (player != null) {
player.release();
player = null;
trackSelector = null;
simpleExoPlayerView.setPlayer(null);
}
}
@Override
public void onStart() {
super.onStart();
if (player == null && currentGalleryModel != null) {
initializePlayer();
}
}
@Override
public void onResume() {
super.onResume();
if (player == null && currentGalleryModel != null) {
initializePlayer();
}
}
@Override
public void onPause() {
super.onPause();
releasePlayer();
}
@Override
public void onStop() {
super.onStop();
releasePlayer();
}
在onViewCreated() 我正在初始化这样的视图:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (currentGalleryModel.isVideo() || currentGalleryModel.isAudio()) {
simpleExoPlayerView.setVisibility(View.VISIBLE);
imageView.setVisibility(View.GONE);
initializePlayer();
} else if (currentGalleryModel.isImage() || currentGalleryModel.isGif()) {
simpleExoPlayerView.setVisibility(View.GONE);
imageView.setVisibility(View.VISIBLE);
Glide.with(this)
.load(currentGalleryModel.getFilePath())
.placeholder(android.R.color.black)
.fitCenter()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
}
}
我正在使用FragmentStatePagerAdapeter。这是getItem 方法:
@Override
public Fragment getItem(int position) {
return ItemViewerFragment.newInstance(mItems.get(position));
}
我无法在第一次滑动Viewpager 时检测到片段的onPause。第二次滑动时,video/audio 文件将停止播放。
在活动中我尝试添加.addOnPageChangeListener:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
try {
((ItemViewerFragment)mAdapter.getItem(mPreviousPos)).imHiddenNow();
} catch (Exception e) {
e.printStackTrace();
}
mPreviousPos = position;
}
在ItemViewerFragment.java:
public void imHiddenNow(){
releasePlayer();
}
video/audio 还在继续播放。
这是截屏视频的Video Link。
【问题讨论】:
-
如何在 onScrollListener 中获取上一个位置?
-
另外我看到 getItem 方法每次都返回一个 newInstance 这可能是原因。
-
初始化时,我正在存储正在显示的
GalleryModel的当前位置。所以假设我的列表中有 30 项,我显示的是第 5 项。然后onScroll前一个位置将是第 5 位,当前位置将是第 4 位或第 6 位,具体取决于滚动的哪一侧。 -
获取项目看起来很可疑,我正在用一些代码发布答案,尝试使用 pageAdapter。
-
我使用的是相同的片段,所以我每次都返回
newInstance。您对我们如何改进这一点有任何想法吗?
标签: java android android-viewpager exoplayer