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

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

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

我实验了viewpager加载四个fragment:

第一次进入的时候:

1
2
3
4
5
6
<span style="font-size:18px;">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</span>

往右滑动到第二个界面:

1
2
3
<span style="font-size:18px;">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</span>

往右滑动到第三个界面:

1
2
3
4
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

往右滑动到第四个界面:

1
03-01 13:56:22.021  24165-24165/com.graypn.modelproject I/onDestroyView2﹕ onDestroyView

往左划到第三个界面:

1
2
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,如下时我优化后的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<span style="font-size:18px;">/**
 * 提供了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<string> callback) {
        if (0 == NetUtils.isNetworkAvailable(getActivity())) {
            new CustomToast(getActivity(), 无网络,请检查网络连接!, 0).show();
        } else {
            NetUtils.loadData(method, url, params, callback);
        }
    }
 
}</string></span>

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

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

算是优雅的解决了优化的问题,希望能帮到有同样问题的同学。

关于fragment+viewpager的优化的更多相关文章

  1. 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航

    Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actio ...

  2. TabActivity 、fragemnt+fragment 和 Fragment+Viewpager 优缺点

    1 TabActivity : 1 过时了 . 2 activity . 是作为android的四大组件...                   重量级的家伙   ViewGroup   : 特别麻 ...

  3. Android主页导航:fragment+viewpager

    简单实现Fragment+ViewPager实现主页导航控制,效果如下: 一.activity_main.xml布局文件: <?xml version="1.0" encod ...

  4. 巧力避免ViewPager的预加载数据,Tablayout+Fragment+viewPager

    问题描述 最近在进行一个项目的开发,其中使用到了Tablayout+Fragment+viewPager来搭建一个基本的框架,从而出现了设置数据适配器的时候,item的位置错乱问题.我打印log日志的 ...

  5. Android中Fragment+ViewPager的配合使用

    官方推荐 ViewPager与Fragment一起使用,可以更加方便的管理每个Page的生命周期,这里有标准的适配器实现用于ViewPager和Fragment,涵盖最常见的用例.FragmentPa ...

  6. Fragment +ViewPager

    public class MainActivity extends FragmentActivity { private ViewPager vp; @Override    protected vo ...

  7. 安卓开发笔记——Fragment+ViewPager组件(高仿微信界面)

    什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再 ...

  8. Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager

    action来实现tab标签 并跟fragment结合 因为要写新闻客户端这个tab导航是必须的 这里我写几个小练习,希望大家融会贯通. 1actionbar设置tab +fragment 布局是个l ...

  9. Viewpager模仿微信主布局的三种方式 ViewPager,Fragment,ViewPager+FragmentPagerAdapter

    效果大概就是这样 很简单 : 1 创建 top 和bottom 2主界面布局 添加top 和bottom 中间添加一个ViewPage 3 给ViewPager 和 底部View设置点击事件 源码下载 ...

随机推荐

  1. Python按行输出文件内容具体解释及延伸

    下面两端測试代码分别为笔者所写,第一段为错误版本号.后者为正确版本号: #! /usr/bin/python2.7 try:     filename = raw_input('please inpu ...

  2. [办公应用]如何保护我的EXCEL表格结构,不被填表人员随意改动

    同事很苦恼的说,下发要求部门人员填写的EXCEL表格,已经加了密码,结果最后还是被他们自行复制后,更改了列结构,“一塌糊涂”的填写交了上来.这样给他的后续处理带来了很多麻烦. 我相信不少朋友很多时候都 ...

  3. JS重名解决方案

    一个页面如果引用多个JS,或者像ASP.NET MVC,一个视图包含多个子视图,每个子视图有自己的JS,那么变量.函数的重名冲突机会将会大增. 如何解决? 这里有一个方案: 1.用类来封装子页的JS代 ...

  4. JFreeChart简单用法

    需要用到的包 jfreechart-0.9.20.jar,jcommon-0.9.5.jar 创建一般步骤: 1.生成org.jfree.data.DefaultCategoryDataset对象,方 ...

  5. BZOJ_1493_[NOI2007]项链工厂_Splay

    BZOJ_1493_[NOI2007]项链工厂_Splay Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打算 ...

  6. 2018.09.08 DL24 Day1 总结

    补一下之前的总结…… T1.restaurant 这道题还是很简单的嘛,子恒dalao非常良心.我们把招牌菜和所需要的菜品绑定在一起就成了完全背包,然后直接跑一遍完全背包即可. #include< ...

  7. SQLAlchemy框架---ORM思想

  8. LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP

    题目:https://loj.ac/problem/6089 对于 i <= √n ,设 f[i][j] 表示前 i 种,体积为 j 的方案数,那么 f[i][j] = ∑(1 <= k ...

  9. vue中子组件向父组件传值

    1.子组件$emit()触发,父组件$on()监听 子组件:<template> <div class="hello"> <button v-on:c ...

  10. bzoj 4326: NOIP2015 运输计划【树链剖分+二分+树上差分】

    常数巨大,lg上开o2才能A 首先预处理出运输计划的长度len和lca,然后二分一个长度w,对于长度大于w的运输计划,在树上差分(d[u]+1,d[v]+1,d[lca]-2),然后dfs,找出所有覆 ...