I use ViewPager with one instance of the fragment in which I display Media files such as images, videos, audio.
I implemented ExoPlayer to process Video and Audio files. And Glide for images.
From this, to avoid memory leaks, I free the ExoPlayer object like this in 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(); }
And in onViewCreated() I initialize the view as follows:
@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); } }
I am using FragmentStatePagerAdapeter . This is the getItem method:
@Override public Fragment getItem(int position) { return ItemViewerFragment.newInstance(mItems.get(position)); }
I cannot detect onPause fragment at first Viewpager . The second time you scroll through video/audio files stop playing.
In .addOnPageChangeListener I tried to add .addOnPageChangeListener :
@Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { try { ((ItemViewerFragment)mAdapter.getItem(mPreviousPos)).imHiddenNow(); } catch (Exception e) { e.printStackTrace(); } mPreviousPos = position; }
And in ItemViewerFragment.java :
public void imHiddenNow(){ releasePlayer(); }
However, video/audio continues to play.
Here is a video link to the screencast.
GitHub demo project here .
Please note that the solution posted below does not work .