Я использую ViewPager
с одним экземпляром фрагмента, в котором я показываю Media
файлы, такие как изображения, видео, аудио.
Я реализовал ExoPlayer
для обработки Video
и Audio
файлов. И Glide
для изображений.
Из этого, чтобы избежать утечек памяти, я освобождаю объект ExoPlayer
как это в ItemViewerFragment.java
:
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));
}
Я не могу обнаружить onPause
фрагмента при первом Viewpager
. При втором пролистывании video/audio
файлы перестают воспроизводиться.
В .addOnPageChangeListener
я попытался добавить .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
продолжает играть.
Вот видео ссылка на скринкаст.
Демонстрационный проект GitHub по ссылке.
Пожалуйста, обратите внимание, что решение, опубликованное ниже , не работает.