一、viewpager+fragment动态增删缓存问题
产生原因:
我们在开发中会常常用到viewpager+fragment,有时候可能会有这样的需求,需要对viewpager中的内容进行动态的增删管理,但是我们都知道viewpager为了保 证滑动的流畅性,viewpager在加载当前页的时候已经将pager页左右页的内容加载进内存里了,所以此时我们不进行任何处理的话,是我发达到我们预期的效果的。
解决方案:
1.将fragmentpageradapter 替换成fragmentstatepageradapter,
因为前者只要加载过,fragment中的视图就一直在内存中,在这个过
程中无论你怎么刷新,都是无用的,直至程序退出;
后者可以满足我们的需求。
2.我们可以重写adapter的方法–getitemposition(),让其返回pageradapter.position_none即可。
以下为引用内容:
@override
public int getitemposition(object object) {
// todo auto-generated method stub
return pageradapter.position_none;
}
到这一步我们就可以真正的实现随意、彻底删除viewpager中的fragment,随意增删。
二、善用dialog
一些交互简单、或者只是展示功能的页面,如果使用一个activity来显示的话,过于繁琐,开销也很大,使用fragment的话,蛋疼的生命周期也不好处理,此时使用一个全屏的dialog来模拟一个activity就是一个不错的选择,详情请参照我博客中的一篇帖子dialog的高冷用法。
三、splash页面那点事
几乎每个页面都会有一个spalsh页,通常我们会用一个activity加载一张全屏的背景图,或者放一个app的logo,展示2秒之后,跳转到登录或者主页面,期间可能会做一些数据初始化,检查更新等操作。相信大多数小伙伴也是这么干的,但是,你不觉得一个activity只显示2秒就杀掉有点浪费?个人觉得这样的开销是非常之不划算的,我们可以借用上面一条,利用一个dialog模拟一个splash页面,2秒之后dismiss掉这个dialog,而检查更新,初始化数据等操作就放到mainactivity中。或者使用fragment替 代splashactivity等等方法, 都可以达到splash页的相同效果。
四、善待内部类
在开发中,我们会经常用到内部类,内部类的出现,解决了java只能单继承的局限性,使得开发能更加灵活。但如果内部类用的不好,就会出现android developer的噩梦,oom!。为什么呢?底子稍微好点的同学,应该都知道内部类可以访问外部类的成员变量和方法,因为内部类持有了外部类的引用,当你在一个activity中使用的内部类,当activity销毁时,你的内部类没有释放,就会造成这个activity无法被gc回收,因为内部类中持有了activity的应用。如果你对内部类不太了解,或者不熟悉的换,可以先看下我的这篇博文深入理解java内部类
五、library那些事
library中的switch中不能使用id来case,这个在我的上一篇博文中已经讲过。这里我们再讲一个library的坑,当我们引入一个依赖库时,依赖库中一般都会自带一个support v4的包,这个v4包的版本,和我们创建工程时的版本一般情况下是一致的,但是一旦我们自己工程的v4包的依赖库中的v4包中的版本不一致时,一大推莫名其妙的错误日志就会接踵而来。此时的处理方法也很简单,由于v4包都是向下兼容的,只需要保持依赖库的版本和我们自身项目的版本一致即可。