Advertisement

Fragment生命周期初研究

阅读量:

最近正在深入研究MVP模式,在网上偶然访问到了一位大神开发的开源项目,在探索过程中意外地发现了一个全新的领域。这个发现竟然颠覆性地改变了我对frameroot项目的生命周期的认知!看来菜鸡我也只能自食其果地感到无奈和惋惜了。

这个大家肯定都非常熟悉,看周期方法回调进行不同的需求方法。

使用Fragment确实非常便捷且灵活。在ViewPage组件中引入PageAdapter来统一管理所有Fragment是可行的。然而,在实际应用中我们发现存在一个问题:当为一个Fragment加载时会预缓存其左右页面(默认仅限一个),这会导致在左侧或右侧页面尚未完全展示时就触发了正常的生命周期事件(onCreate,onCreateView,onResume)。这种设计虽然提高了性能效率但会给用户体验带来困扰因为在这种情况下用户可能不会意识到左侧或右侧页面尚未完全展示而已经开始了相应的渲染过程

举例来说,在一个ViewPager中存在三个Fragment页面时,默认情况下第一个页面可见并加载数据后显示界面。从而在后台就会收集到了紧邻的那个Fragment的信息数据。

该怎么操作呢?实际上这个功能实现起来相当容易,在Fragment中特别设计了一个名为setUserVisibleHint的函数来完成这一操作。

复制代码
 /** * 实现该方法即可实现可见再加载。不可见不加载的效果!!!
    
      * @param isVisibleToUser
    
      */
    
     @Override
    
     public void setUserVisibleHint(boolean isVisibleToUser) {
    
     super.setUserVisibleHint(isVisibleToUser);
    
     if (isVisibleToUser) {
    
         if (isFirstVisible) {
    
             isFirstVisible = false;
    
             initPrepare();
    
         } else {
    
             onUserVisible();
    
         }
    
     } else {
    
         if (isFirstInvisible) {
    
             isFirstInvisible = false;
    
             onFirstUserInvisible();
    
         } else {
    
             onUserInvisible();
    
         }
    
     }
    
     }
    
    
    
    
    代码解读

用法极为简便:可以直接在Fragment类中重新编写该方法以实现其功能。
完成相应的操作流程时会启动线程并连接后台服务器以获取所需数据,并实时加载并展示界面相关数据。同时还可以对当前Fragment的使用情况进行统计:统计当前Fragment已经被访问过多少次。
当isVisibleToUser为false时,则表示当前Fragment不可见:此时用户可以根据具体需求执行响应的操作

握手

在重复一句,上面的方法超级简单、实用!!!

当然 大家也会说 使用lazyviewpager 其实一吊样啦

然后看下 我打印的Log

复制代码
 public class Fragment1 extends Fragment {

    
     private static final String TAG = "Fragment1";
    
  
    
     @Override
    
     public void onAttach(Activity activity) {
    
     super.onAttach(activity);
    
     L.v(TAG, "onAttach");
    
     }
    
  
    
     @Override
    
     public void setUserVisibleHint(boolean isVisibleToUser) {
    
     L.v(TAG, "setUserVisibleHint " + isVisibleToUser);
    
     }
    
  
    
     @Override
    
     public void onCreate(Bundle savedInstanceState) {
    
     super.onCreate(savedInstanceState);
    
     L.v(TAG, "onCreate");
    
     }
    
  
    
     @Override
    
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
     L.v(TAG, "onCreateView");
    
     View view = inflater.inflate(R.layout.fragment_layout,null);
    
     TextView tv = (TextView) view.findViewById(R.id.tv1);
    
     tv.setText(TAG);
    
     return view;
    
     }
    
  
    
     @Override
    
     public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    
     super.onActivityCreated(savedInstanceState);
    
     L.v(TAG,"onActivityCreated");
    
     }
    
  
    
     @Override
    
     public void onResume() {
    
     super.onResume();
    
     L.v(TAG, "onResume()");
    
     }
    
  
    
     @Override
    
     public void onPause() {
    
     super.onPause();
    
     L.v(TAG,"onPause");
    
     }
    
  
    
     @Override
    
     public void onStop() {
    
     super.onStop();
    
     L.v(TAG,"onStop");
    
     }

全部评论 (0)

还没有任何评论哟~