gpt4 book ai didi

java - 在 ViewPager 的滑动上停止 Exoplayer

转载 作者:太空狗 更新时间:2023-10-29 22:57:00 25 4
gpt4 key购买 nike

我正在使用带有单个 fragment 实例的 ViewPager,我在其中显示 Media 文件,如图像、视频、音频。

我已经实现了 ExoPlayer 来处理 VideoAudio 文件。和用于图像的 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() 中,我正在像这样初始化 View :

 @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 时检测到 fragment 的 onPause。第二次滑动 video/audio 文件停止播放。

在 Activity 中,我尝试添加 .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到截屏视频。

Demo project GitHub link .

最佳答案

我遵循了维护 HashMap 的方法内部的 fragment 对象 PagerAdapter

  1. 声明一个接口(interface):
interface FragmentLifecycle {
void onPauseFragment()
}
  1. 在 Fragment 中实现接口(interface)。
public void onPauseFragment() {
if (simpleExoPlayer != null){
simpleExoPlayer.setPlayWhenReady(false);
}
}
  1. 将所有 fragment 对象存储在 HashMap<Integer,Fragment> 中以各自的位置作为关键。在 PagerAdapter 中声明 hashmap .还要声明一个 getter 方法,用于从 hashmap 访问 fragment 对象。例如

    @Override
    public Fragment getItem(int position) {
    ItemViewerFragment fragment = ItemViewerFragment.newInstance(mItems.get(position));
    mFragments.put(position,fragment);
    return fragment;
    }

    public ItemViewerFragment getMapItem(int position) { 返回 mFragments.get(位置);

  2. 在您声明的 Activity 中 viewPager保留一个变量 currentPosition并实现 ViewPager.OnPageChangeListener .

  3. 内部 onPageSelected方法,

        @Override
    public void onPageSelected(int position) {
    if(mAdapter.getMapItem(currentPosition) != null) (mAdapter.getMapItem(currentPosition)).onPauseFragment();
    currentPosition = position;
    }

关于java - 在 ViewPager 的滑动上停止 Exoplayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46684356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com