专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
开发者全社区  ·  小作文频出!某基金经理晕厥 ·  昨天  
开发者全社区  ·  中国十大古都城市 ·  昨天  
开发者全社区  ·  资产上亿的牛散,真实身份竟是南航空姐 ·  昨天  
开发者全社区  ·  太奇葩了!离职后被前公司调查去向...... ·  2 天前  
51好读  ›  专栏  ›  安卓开发精选

ViewPager+Fragment LazyLoad 最优解

安卓开发精选  · 公众号  · android  · 2017-01-30 20:34

正文

(点击 上方公众号 ,可快速关注)


来源:尹star

http://www.jianshu.com/p/c5d29a0c3f4c

如有好文章投稿,请点击 → 这里了解详情


ViewPager+Fragment的模式再常见不过了,以国民应用微信为例,假设微信也是ViewPager+Fragment的实现方式,那表现形式上就是一个ViewPager管理了四个Fragment,左右滑动来回切换。但是ViewPager有一个奇葩的特性叫:预加载,比如打开微信,首先看到的是第一个Tab(微信),但事实上第二个Tab(通讯录)已经加载好了。当选择第二个Tab(通讯录),第三个Tab(发现)已经加载好了,以此类推。


但上述ViewPager+Fragment的这种组合并不完美,因为我希望用户选择了哪个Tab再去加载哪个Tab的数据,而不要去做预加载,假如当前页面和预加载页面都有大量的网络请求,可能就会比较慢,有很多请求在排队。关于这个问题,也有很偏激的做法,比如弃用ViewPager,自己手动管理Fragment,或者直接禁掉ViewPager预加载。有一种比较合适的方案是保持ViewPager预加载的特性,但是只初始化View,选择当前Tab的时候再进行网络请求。关于这一方案的实现,也是众说纷纭,千奇百怪。最后,还是选择男神Stay的方案。


直接上代码。


public abstract class BasePageFragment extends Fragment {

protected boolean isViewInitiated ;

protected boolean isVisibleToUser ;

protected boolean isDataInitiated ;

@Override

public void onCreate ( Bundle savedInstanceState ) {

super . onCreate ( savedInstanceState );

}

@Override

public void onActivityCreated ( Bundle savedInstanceState ) {

super . onActivityCreated ( savedInstanceState );

isViewInitiated = true ;

prepareFetchData ();

}

@Override

public void setUserVisibleHint ( boolean isVisibleToUser ) {

super . setUserVisibleHint ( isVisibleToUser );

this . isVisibleToUser = isVisibleToUser ;

prepareFetchData ();

}

public abstract void fetchData ();

public boolean prepareFetchData () {

return prepareFetchData ( false );

}

public boolean prepareFetchData ( boolean forceUpdate ) {

if ( isVisibleToUser && isViewInitiated && ( ! isDataInitiated || forceUpdate )) {

fetchData ();

isDataInitiated = true ;

return true ;

}

return false ;

}

}


这是一个父类,看代码这里只有一个setUserVisibleHint需要说下,这是一个相当生僻的方法,我们可以用这个方法来判断当前UI是否可见,所以在prepareFetchData方法里我们做如下判断:就是当前UI可见,并且fragment已经初始化完毕,如果网络数据未加载,那么请求数据,或者需要强制刷新页面,那么也去请求数据,So easy。子Fragment只需要继承父类,实现抽象方法,在fetchData()里做网络请求或者其他耗时操作即可。再在写个子类吧。







请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  小作文频出!某基金经理晕厥
昨天
开发者全社区  ·  中国十大古都城市
昨天
开发者全社区  ·  太奇葩了!离职后被前公司调查去向......
2 天前
51Testing软件测试网  ·  APP功能测试的7大注意点
7 年前
周冲的影像声色  ·  最懂女人的,原来是这种男人
7 年前
医学界影像诊断与介入频道  ·  脉络膜裂内的良性囊变,是什么?
7 年前