返回 登录
0

Android开发技巧、常见的坑和解决方案(二)

一、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包都是向下兼容的,只需要保持依赖库的版本和我们自身项目的版本一致即可。
今天暂时先总结到这里,如果上述言论有错误的地方,希望各位小伙伴们及时指出。欢迎大家关注的我博客Hi小鱼

评论