设为首页 加入收藏

TOP

关于fragment+viewpager的优化(一)
2015-07-20 17:14:46 来源: 作者: 【 】 浏览:6
Tags:关于 fragment viewpager 优化

?

?

上次写了一个问答项目,用的fragment+viewpager架构,后来发现,划了几次之后,再划回来,会重新加载布局,重新获取数据,这样整个程序和卡,并且占用太多的网络资源。

当时的解决办法是,自己重写view,用最基本的Basepageradapder,算是不是很优雅的解决了问题。

当时知道是重新调用onCreateView方法原因,但是没有好的解决办法,现在知道了,这里记载一下。

?

我实验了viewpager加载四个fragment:

第一次进入的时候:

?

03-01 13:50:16.151  22667-22667/com.graypn.modelproject I/onCreate1? onCreate
03-01 13:50:16.151  22667-22667/com.graypn.modelproject I/onCreateView1? onCreateView
03-01 13:50:16.161  22667-22667/com.graypn.modelproject I/onActivityCreated1? onActivityCreated
03-01 13:50:16.161  22667-22667/com.graypn.modelproject I/onCreate2? onCreate
03-01 13:50:16.161  22667-22667/com.graypn.modelproject I/onCreateView2? onCreateView
03-01 13:50:16.161  22667-22667/com.graypn.modelproject I/onActivityCreated2? onActivityCreated
往右滑动到第二个界面:

?

?

03-01 13:51:22.391  22667-22667/com.graypn.modelproject I/onCreate3? onCreate
03-01 13:51:22.391  22667-22667/com.graypn.modelproject I/onCreateView3? onCreateView
03-01 13:51:22.401  22667-22667/com.graypn.modelproject I/onActivityCreated3? onActivityCreated
往右滑动到第三个界面:
03-01 13:55:24.351  24165-24165/com.graypn.modelproject I/onDestroyView1? onDestroyView
03-01 13:55:24.351  24165-24165/com.graypn.modelproject I/onCreate4? onCreate
03-01 13:55:24.351  24165-24165/com.graypn.modelproject I/onCreateView4? onCreateView
03-01 13:55:24.361  24165-24165/com.graypn.modelproject I/onActivityCreated4? onActivityCreated
往右滑动到第四个界面:
03-01 13:56:22.021  24165-24165/com.graypn.modelproject I/onDestroyView2? onDestroyView
往左划到第三个界面:
03-01 13:58:09.541  24165-24165/com.graypn.modelproject I/onCreateView2? onCreateView
03-01 13:58:09.541  24165-24165/com.graypn.modelproject I/onActivityCreated2? onActivityCreated

?

结论:viewpager会加载和当前页面相连的两个fragment,会销毁相邻第三个页面的view,再次调用是会重新oncreateview和onactivityreate。

我们需要优化自己的fragment,如下时我优化后的类:

?

/**
 * 提供了fragment的封装后基类,提供context给子类使用
 *
 * @author Graypn
 */
public abstract class BaseFragment extends Fragment {

    //根部view
    private View rootView;
    protected Context context;
    private Boolean hasInitData = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getActivity();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (rootView == null) {
            rootView = initView(inflater);
        }
        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (!hasInitData) {
            initData();
            hasInitData = true;
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ((ViewGroup) rootView.getParent()).removeView(rootView);
    }

    /**
     * 子类实现初始化View操作
     */
    protected abstract View initView(LayoutInflater inflater);

    /**
     * 子类实现初始化数据操作(子类自己调用)
     */
    public abstract void initData();

    /**
     * 封装从网络下载数据
     */
    protected void loadData(HttpRequest.HttpMethod method, String url,
                            RequestParams params, RequestCallBack
   
     callback) { if (0 == NetUtils.isNetworkAvailable(getActivity())) { new CustomToast(getActivity(), 无网络,请检查网络连接!, 0).show(); } else { NetUtils.loadData(method, url, params, callback); } } }
   

加入rootView,缓存加载后的view,如果有就不重新加载数据。

?

加入判断是否已经加载数据完成的标志变量,如果已经加载了数据,就不重新加载数

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDOJ 1163 Eddy's digital Ro.. 下一篇hdu 1524 A Chess Game 博弈之,S..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)
·使用华为开发者空间 (2025-12-27 04:19:24)
·Getting Started wit (2025-12-27 03:49:24)
·Ubuntu 上最好用的中 (2025-12-27 03:49:20)