在滑出屏幕時(shí) view會被銷毀
比如有6個(gè)fragments
先到 fragment 1
跳到 fragment 6
此時(shí)fragment 1的view就會被銷了
然鵝....
fragment對象是保留的 在內(nèi)存中 沒有被銷毀fragment中的數(shù)據(jù)也是保留的
這就是一個(gè)問題
view被銷毀了 而數(shù)據(jù)還在
如果下次展示頁面的時(shí)候 不想重復(fù)請求數(shù)據(jù)了
那就恢復(fù)一下
view
view和數(shù)據(jù)的綁定關(guān)系
就可以了
展示頁面和加載數(shù)據(jù)的邏輯
~~ boolean mIsVisibleToUser; // 頁面是否可見
~~ boolean mIsViewCreated; // 頁面的view是否加載
~~ boolean mHasDataLoaded; // 數(shù)據(jù)是否加載
~~
~~ public void getData() {
~~ // 得到數(shù)據(jù)
~~ if (mHasDataLoaded) {
~~ restoreDataAndView();
~~ } else {
~~ mHasDataLoaded = true;
~~ initData();
~~ }
~~ }
~~
~~ void restoreDataAndView() {
~~ // 恢復(fù)view和數(shù)據(jù)的綁定關(guān)系
~~ }
~~
~~ void initData() {
~~ // 初始化數(shù)據(jù) 從本地取 從網(wǎng)絡(luò)取
~~ }
~~
~~ @Override
~~ public void setUserVisibleHint(boolean isVisibleToUser) {
~~ // 生命周期方法
~~ super.setUserVisibleHint(isVisibleToUser);
~~ mIsVisibleToUser = isVisibleToUser;
~~ if (mIsVisibleToUser && mIsViewCreated) {
~~ getData();
~~ }
~~ }
~~
~~ @Override
~~ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
~~ // 生命周期方法
~~ super.onActivityCreated(savedInstanceState);
~~ if (mIsVisibleToUser) {
~~ getData();
~~ }
~~ }
~~
~~ @Override
~~ public void onDestroyView() {
~~ // 生命周期方法
~~ super.onDestroyView();
~~ mIsViewCreated = false; // 設(shè)置view被銷毀
~~
~~ Log.i("Test", "------onDestroyView-------");
~~ }
fragment的生命周期
step 1. app啟動 展示fragment 1
**fragment 1 **
[正式加載]
setUserVisibleHint ::false::
setUserVisibleHint ::true::
onAttach
onCreate
onCreateView
onViewCreated
onActivityCreated
onViewStateRestored
onStart
onResume
此時(shí)fragment 2 沒有顯示 但預(yù)加載
[預(yù)加載]
setUserVisibleHint ::false::
onAttach
onCreate
onCreateView
onViewCreated
onActivityCreated
onViewStateRestored
onStart
onResume
step 2. 切換到 fragment 2
** fragment 2 **
setUserVisibleHint :: true ::
** fragment 1 **
setUserVisibleHint :: false ::
** fragment 3 **
[預(yù)加載]
step 3. 切換到 fragment 6
**[正式加載] 6 **
[預(yù)加載] 5,7 左右兩邊的
** fragment 1 **
onPause
onStop
onDestroyView
** fragment 2 **
setUserVisibleHint :: false ::
onPause
onStop
onDestroyView