在滑出屏幕时 view会被销毁
比如有6个fragments
先到 fragment 1
跳到 fragment 6
此时fragment 1的view就会被销了
然鹅....
fragment对象是保留的 在内存中 没有被销毁fragment中的数据也是保留的
这就是一个问题
view被销毁了 而数据还在
如果下次展示页面的时候 不想重复请求数据了
那就恢复一下
view
view和数据的绑定关系
就可以了
展示页面和加载数据的逻辑
~~ boolean mIsVisibleToUser; // 页面是否可见
~~ boolean mIsViewCreated; // 页面的view是否加载
~~ boolean mHasDataLoaded; // 数据是否加载
~~
~~ public void getData() {
~~ // 得到数据
~~ if (mHasDataLoaded) {
~~ restoreDataAndView();
~~ } else {
~~ mHasDataLoaded = true;
~~ initData();
~~ }
~~ }
~~
~~ void restoreDataAndView() {
~~ // 恢复view和数据的绑定关系
~~ }
~~
~~ void initData() {
~~ // 初始化数据 从本地取 从网络取
~~ }
~~
~~ @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; // 设置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
此时fragment 2 没有显示 但预加载
[预加载]
setUserVisibleHint ::false::
onAttach
onCreate
onCreateView
onViewCreated
onActivityCreated
onViewStateRestored
onStart
onResume
step 2. 切换到 fragment 2
** fragment 2 **
setUserVisibleHint :: true ::
** fragment 1 **
setUserVisibleHint :: false ::
** fragment 3 **
[预加载]
step 3. 切换到 fragment 6
**[正式加载] 6 **
[预加载] 5,7 左右两边的
** fragment 1 **
onPause
onStop
onDestroyView
** fragment 2 **
setUserVisibleHint :: false ::
onPause
onStop
onDestroyView