Поведение жизненного цикла фрагмента с использованием ViewPager2 и FragmentStateAdapter - PullRequest
3 голосов
/ 28 февраля 2020

Я отображаю 5 fragments, используя ViewPager2 и 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);

ViewPagerAdapter

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();
    }

}

Обновлено

Это тоже похожий вопрос

1 Ответ

1 голос
/ 02 марта 2020

Я отослал это POST для решения.

VeiwPager2 построен на RecyclerView компоненте и FragmentStateAdapter заменяет FragmentStatePagerAdapter.

Предполагая, что offscreenPageLimit = 1, ViewPager2 будет иметь 3 fragments и 2 fragments, предварительно загруженные / кэшированные RecylerView Стратегии предварительной загрузки Итак, всего будет загружено 5 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());
    }
}

Прокрутка журналов до

//1st
2020-03-02 18:05:15.255 12541-12541/com.example.rajat.demo I/PostFragment: onStart: 0
2020-03-02 18:05:15.256 12541-12541/com.example.rajat.demo I/PostFragment: onResume: 0
2020-03-02 18:05:15.375 12541-12541/com.example.rajat.demo I/PostFragment: onStart: 1

//2nd
2020-03-02 18:09:16.746 12541-12541/com.example.rajat.demo I/PostFragment: onStart: 2
2020-03-02 18:09:16.900 12541-12541/com.example.rajat.demo I/PostFragment: onPause: 0
2020-03-02 18:09:16.904 12541-12541/com.example.rajat.demo I/PostFragment: onResume: 1

//3rd
2020-03-02 18:09:49.759 12541-12541/com.example.rajat.demo I/PostFragment: onStart: 3
2020-03-02 18:09:49.940 12541-12541/com.example.rajat.demo I/PostFragment: onPause: 1
2020-03-02 18:09:49.945 12541-12541/com.example.rajat.demo I/PostFragment: onResume: 2

//4th
2020-03-02 18:10:06.636 12541-12541/com.example.rajat.demo I/PostFragment: onStart: 4
2020-03-02 18:10:06.826 12541-12541/com.example.rajat.demo I/PostFragment: onPause: 2
2020-03-02 18:10:06.830 12541-12541/com.example.rajat.demo I/PostFragment: onResume: 3

//5th
2020-03-02 18:10:17.737 12541-12541/com.example.rajat.demo I/PostFragment: onStart: 5
2020-03-02 18:10:18.070 12541-12541/com.example.rajat.demo I/PostFragment: onStop: 0
2020-03-02 18:10:18.071 12541-12541/com.example.rajat.demo I/PostFragment: onDestroyView: 0
2020-03-02 18:10:18.139 12541-12541/com.example.rajat.demo I/PostFragment: onDestroy: 0
2020-03-02 18:10:18.139 12541-12541/com.example.rajat.demo I/PostFragment: onDetach: 0
2020-03-02 18:10:18.144 12541-12541/com.example.rajat.demo I/PostFragment: onPause: 3
2020-03-02 18:10:18.148 12541-12541/com.example.rajat.demo I/PostFragment: onResume: 4

Прокрутка журналов после

//1st
2020-03-02 18:11:20.439 14463-14463/com.example.rajat.demo I/PostFragment: onStart: 0
2020-03-02 18:11:20.441 14463-14463/com.example.rajat.demo I/PostFragment: onResume: 0
2020-03-02 18:11:20.642 14463-14463/com.example.rajat.demo I/PostFragment: onStart: 1

//2nd
2020-03-02 18:11:43.833 14463-14463/com.example.rajat.demo I/PostFragment: onStart: 2
2020-03-02 18:11:43.948 14463-14463/com.example.rajat.demo I/PostFragment: onPause: 0
2020-03-02 18:11:43.956 14463-14463/com.example.rajat.demo I/PostFragment: onResume: 1

//3rd
2020-03-02 18:11:52.523 14463-14463/com.example.rajat.demo I/PostFragment: onStart: 3
2020-03-02 18:11:52.686 14463-14463/com.example.rajat.demo I/PostFragment: onStop: 0
2020-03-02 18:11:52.686 14463-14463/com.example.rajat.demo I/PostFragment: onDestroyView: 0
2020-03-02 18:11:52.753 14463-14463/com.example.rajat.demo I/PostFragment: onDestroy: 0
2020-03-02 18:11:52.753 14463-14463/com.example.rajat.demo I/PostFragment: onDetach: 0
2020-03-02 18:11:52.758 14463-14463/com.example.rajat.demo I/PostFragment: onPause: 1
2020-03-02 18:11:52.761 14463-14463/com.example.rajat.demo I/PostFragment: onResume: 2
...