Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)
1.前言
昨天谈了BaseActivity的封装,
Android谈谈封装那些事--BaseActivity和BaseFragment(一)
有很多小伙伴提了很多建议,比如:
- 通用标题栏可以自定义View而不放在Base里面,代码更统一
- BaseEventActivity里面应该留出开关保证不需要Bus的Activity使用
- BaseStatusActivity里面就一个方法没必要新建一个
- 还有一些小的细节
在这里感谢大家的建议了啊。我修改了一部分,后面会慢慢优化,最后在HLibrary里面贴出最优代码。还有那个BaseStatusActivity(沉浸栏)的也会继续优化的。接下来谈谈BaseFragment的封装,其实主要还是关于Fragment的懒加载问题。
2.Fragment相关知识点
- 生命周期
- Fragment的使用:静态、动态
- Fragment应注意到的问题
- ......
在这里就不详细介绍了,想了解的可以看我的这篇文章:
1.Fragment使用场景
我们可以看到市场的APP一般都是用底部Tab+fragment切换为整体架子的,或者通过viewpager作为容器嵌套fragment,再复杂点的就是fragment嵌套fragment,某书、某条等等都是这样;
2.遇到的问题
这样的话我们遇到的问题就是当fragment很多组合使用的时候,每个fragment里面都会加载数据或者执行动画等比较复杂的业务逻辑时,导致我们的APP进入时屏幕卡顿,性能很差,一点都不流畅。即便是我们在使用viewpager作为容器的时候设置预加载setOffscreenPageLimit()这个方法,其实你会发现根本不会起作用。
至于viewpager这个预加载方法为什么不行?我们可以看一下viewpager源码:

我们可以看到DEFAULT_OFFSCREEN_PAGES 这里就定义了默认值是1,如果你调用该方法传进来的值小于1是无效的,会被强行的拽回1。而且DEFAULT_OFFSCREEN_PAGES 这个值是private的,子类继承ViewPager也是不可见的。
网上有的说可以将viewpager的源码复制下来粘到自己的类里面将这个默认值改为0,这个目前还没试过,即使可以感觉也有些别扭,更何况我们使用场景也不一定需要viewpager呢
3.Fragment懒加载
这是靠Fragment里有一个setUserVisibleHint(boolean isVisibleToUser)的方法,我们可以在这个方法里做判断,当其True可见时(即切换到某一个具体Fragment)时才去加载数据,这样可以省流量。
具体怎么去操作呢?
- 预加载初始化数据和组件等轻量操作
- 切换tab到第一次可见时执行网络请求
- 四种状态:第一次可见状态、可见状态、第一次不可见状态、不可见状态
- 销毁时处理解注册、销毁广播等问题
3.BaseFragment封装
1.初始化xml文件
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (getContentViewLayoutID() != 0) {
return inflater.inflate(getContentViewLayoutID(), null);
} else {
return super.onCreateView(inflater, container, savedInstanceState);
}
}
protected abstract int getContentViewLayoutID();
2.注解绑定以及初始化组件
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this,view);
initViewsAndEvents(view);
}
protected abstract void initViewsAndEvents(View view);
3.四种“见”的状态拆分
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initPrepare();
}
private synchronized void initPrepare() {
if (isPrepared) {
onFirstUserVisible();
} else {
isPrepared = true;
}
}
@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();
}
}
}
protected abstract void onFirstUserVisible();
protected abstract void onUserVisible();
private void onFirstUserInvisible() { }
protected abstract void onUserInvisible();
4.最后解注册销毁等工作
@Override
public void onDestroy() {
DetoryViewAndThing();
super.onDestroy();
}
protected abstract void DetoryViewAndThing();
5.跳转界面等方法
/**
* 打开一个Activity 默认 不关闭当前activity
*/
public void gotoActivity(Class<?> clz) {
gotoActivity(clz, false, null);
}
public void gotoActivity(Class<?> clz, boolean isCloseCurrentActivity) {
gotoActivity(clz, isCloseCurrentActivity, null);
}
public void gotoActivity(Class<?> clz, boolean isCloseCurrentActivity, Bundle ex) {
Intent intent = new Intent(mActivity, clz);
if (ex != null) intent.putExtras(ex);
startActivity(intent);
if (isCloseCurrentActivity) {
mActivity.finish();
}
}
最后提一个小问题吧:就是说如果你没有用Fragment懒加载的话而是用的viewpager的预加载,如果你没有自己定义默认预加载个数的话,那么默认肯定是会提前加载的,加入你当前fragment相邻的fragment里面有动画或者视频播放的话,切换到当前fragment时候下个fragment里面的动画或者视频就已经开始执行了,注意一下。
到此我的base就告一段落了,很多不合理的地方,我接下来私下也会去听取小伙伴们的意见进行修改,然后最后在HLibrary里面贴出来的,非常感谢大家。
Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)的更多相关文章
- BaseActivity与BaseFragment的封装
这篇博客主要是从BaseActivity与BaseFragment的封装开始,总结我们在实战开发中关于Fragment的注意事项以及心得体会. 先看以下效果图: 这里模拟的是用户登录模块,你可能会说, ...
- Android打包的那些事
使用gradle打包apk已经成为当前主流趋势,我也在这个过程中经历了各种需求,并不断结合gradle新的支持,一一改进.在此,把这些相关的东西记录,做一总结. 1. 替换AndroidManifes ...
- Android Toast 封装,避免Toast消息覆盖,替换系统Toast最好用的封装
Android Toast 封装,避免Toast消息覆盖,无阻塞,等强大功能 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- 不可不知的 Android strings.xml 那些事
相信 strings.xml 已经是大家在 Android 开发中最熟悉的文件之一了,但其实它也有很多需要注意的地方和一些小技巧,知道了这些可以让你的 Android 应用更加规范易用,大家来看看吧. ...
- 【Android开发那点破事】打开APP加载页面实现
今天的破事呢就说说APP加载页面的实现.一般情况下,当APP打开的时候,我们需要做很多事情,比如检查网络连接啊,初始化一些配置啊等等.我们可以让这些事情在APP完全打开之前做完,然后呢在打开的过程中显 ...
- 关于ANDROID模拟器的一些事
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 继上一篇Android Studio VS Eclipse的文章后接着来分享AnDevCo ...
- [Android开发那点破事]解决android.os.NetworkOnMainThreadException
[Android开发那点破事]解决android.os.NetworkOnMainThreadException 昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003.第一感觉就是好卡 ...
- 【重走Android之路】【路线篇(二)】知识点归纳
[重走Android之路][路线篇(二)]知识点归纳 参考:http://blog.csdn.net/xujing81/article/details/7313507 第一阶段:Java面向对 ...
- Android 布局学习之——Layout(布局)具体解释二(常见布局和布局參数)
[Android布局学习系列] 1.Android 布局学习之--Layout(布局)具体解释一 2.Android 布局学习之--Layout(布局)具体解释二(常见布局和布局參数) ...
随机推荐
- metaWeblog Test
#include "stdio.h" int main(int argc ,char **argv) { printf("argc = %d \n",arg ...
- linux 远程连接工具——MTPuTTY
简介 MTPUTTY是一个非常流行的ssh客户端. 安装 官网地址:http://www.ttyplus.com/multi-tabbed-putty/ 下载并安装,运行软件,如图 添加服务器 结语 ...
- CSS 7阶层叠水平
著名的7阶层叠水平(stacking level) 层叠上下文 background/border 负z-index block块状水平盒子:正常流失布局,非inline-block,无positio ...
- 关于在vs2010中编译Qt项目时出现“无法解析的外部命令”的错误
用Cmake讲Qt.VTK和ITK整合后,打开解决方案后添加新类时运行会出现“n个无法解析的外部命令”的错误. 原因是新建的类未能生成moc文件,解决办法是: 1.右键 要生成moc文件的.h文件,打 ...
- pycharm svn服务器访问不了的问题。
昨天使用pycharm访问svn服务器的时候一直登陆不上. 总结一下遇到的svn的问题. 1.用户名密码错误.简单致命, 2.svn访问权限,这个是svn服务器那边可以设置的. 3.svn路径拼写错误 ...
- 使用VS2010编译Qt 5.6.1过程记录
由于Qt官方发布的Qt 5.6.1二进制安装包没有对应VS2010版本的,而我的电脑上只安装了VS2010,因此只能自己编译. 本文记录本人的编译安装过程,以及其中遇到的一些问题. 本文使用VS201 ...
- 微信小程序开发工具的数据,配置,日志等目录在哪儿? 怎么找?
原文地址:http://www.wxapp-union.com/portal.php?mod=view&aid=359 本文由本站halfyawn原创:感谢原创者:如有疑问,请在评论内回复 ...
- WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日
好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...
- BZOJ 2081: [Poi2010]Beads
Description 问把n截成每个长度后不同子串个数. Sol 调和极数+Hash. 首先这是一个式子 \(n\sum_{i=1}^n \frac {1}{i}\) . 这东西就是调和极数再乘上 ...
- [Sass]嵌套
[Sass]嵌套-选择器嵌套 Sass 中还提供了选择器嵌套功能,但这也并不意味着你在 Sass 中的嵌套是无节制的,因为你嵌套的层级越深,编译出来的 CSS 代码的选择器层级将越深,这往往是大家不愿 ...