使用 ViewPager2 和 FragmentStateAdapter 的片段生命周期行为

Raj*_*ame 5 android fragment android-viewpager exoplayer android-viewpager2

fragments我使用ViewPager2和显示 5 FragmentStateAdapter。每个fragment都有ExoPlayer实例。我正在维护ViewPager2.setOffscreenPageLimit(1),并且加载效果良好fragments。但是,当我向下滚动到ViewPager2,pos4时pos2,pos1应该调用 onStop(), onDestroyView(), onDestroy()。但这并没有发生。

除非我按 ,否则这些方法都不会执行onBackPress()。我在FragmentStateAdapter.

我想执行exoPlayer.release()以onDestroyView()释放应用程序的内存。

这是代码

活动

List<Post> postsList = response.getPosts();
ViewPagerAdapter adapter = new ViewPagerAdapter(this, postsList);
binding.pager.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
binding.pager.setOffscreenPageLimit(1);
binding.pager.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

ViewPager适配器

public class ViewPagerAdapter extends FragmentStateAdapter {

    private List<Post> postList;

    public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity, List<Post> postList) {
        super(fragmentActivity);
        this.postList = postList;
    }


    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return new PostFragment(postList.get(position), position);
    }

    @Override
    public int getItemCount() {
        if (postList == null) return 0;
        return postList.size();
    }

}
Run Code Online (Sandbox Code Playgroud)

更新

这也是一个类似的问题

Raj*_*ame 4

我已参考此 帖子 寻求解决方案。

VeiwPager2建立在RecyclerView组件之上并FragmentStateAdapter取代FragmentStatePagerAdapter.

假设RecylerView 预加载策略将预加载/缓存3 个和2 个offscreenPageLimit = 1, 因此总共将加载5 个。ViewPager2fragments fragments fragments

为了禁用预加载和缓存,我执行了:

private void disableCacheOfViewPager() {

    try {

      // Disable Preloading
        ((RecyclerView) binding.pager.getChildAt(0)).getLayoutManager().setItemPrefetchEnabled(false);
        // Disable Cache
        ((RecyclerView) binding.pager.getChildAt(0)).setItemViewCacheSize(0);

    } catch (NullPointerException e) {

        Log.i(TAG, "disableCacheOfViewPager: " + e.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

之前滚动日志

//1st
onStart: 0
onResume: 0
onStart: 1

//2nd
onStart: 2
onPause: 0
onResume: 1

//3rd
onStart: 3
onPause: 1
onResume: 2

//4th
onStart: 4
onPause: 2
onResume: 3

//5th
onStart: 5
onStop: 0
onDestroyView: 0
onDestroy: 0
onDetach: 0
onPause: 3
onResume: 4
Run Code Online (Sandbox Code Playgroud)

之后滚动日志

//1st
onStart: 0
onResume: 0
onStart: 1

//2nd
onStart: 2
onPause: 0
onResume: 1

//3rd
onStart: 3
onStop: 0
onDestroyView: 0
onDestroy: 0
onDetach: 0
onPause: 1
onResume: 2
Run Code Online (Sandbox Code Playgroud)