Android开发性能优化总结

一. 加载

预加载:1.反射注解框架Reflect信息,在Application内多线程预加载至缓存。2.资源预加载

懒加载:1.Fragment懒加载2.资源懒加载

二. 缓存

1. Http缓存,淘汰时间

2. 图片缓存,bitmap压缩,Lru淘汰,持久化二级缓存

3. 反射注解框架Reflect信息缓存,防止多次反射操作

三. 异步防止Anr

1. 避免在UI线程做太多耗时操作,IntentReceiver > 10s Anr

2. 并发操作多用读写锁,少用synchronized,Android虚拟机Art直到Android6.0为止尚未对synchronized做CAS优化,而synchronized在hotspot性能还可以。

3. 使用线程池,结合图片异步加载等需要开大量子线程时做到线程复用。

4. 不需要时取消任务,如Activity被结束时取消正在进行的加载任务。

四. 防止OOM

1. Bitmap:懒加载,LRU缓存,Bitmap压缩(根据ImageView大小),分块加载大图。

2. 大文件,如txt等,分段加载。

3. ListView&GridView做复用优化。利用ViewHolder,setTag

五. View优化

1. 优化布局层次,布局复用,善用include,merge等标签。

2. 避免过度绘制,减少元素,布局的重叠,开启DebugGPU overdraw调试,使用Hierarchy Viewer。简单说就是多次无意义调用onDraw所造成的主线程的性能浪费,可能是帧数下降。

3. onDraw()优化,避免在onDraw里new Paint()等耗时操作,onDraw内仅应当保留必须代码。

六.内存泄漏

1.dump内存进行分析,也可以使用leakcanary库。

2.HashMap避免使用HashCode可变的key

3.谨慎处理Context对象,因为其生命周期由Framework管理,尽量避免私自持有。

4.小心静态变量,及时清除存储在static中的废弃对象。

5.即时释放例如File,Cusor,Stream,Socket等资源对象,因为jni层持有其java层的引用。

6.非静态的匿名内部类。常见于Runnable和Handler。

七.使用性能优秀的Map

1.线程安全的map,ConcurrentHashMap,其使用了分段锁,优化并发性能。

2.使用ArrayMap,空间性能较高。它不是一个适应大数据的数据结构,相比传统的HashMap速度要慢,因为查找方法是二分法,并且当你删除或者添加数据时,会对空间重新调整,在使用大量数据时,效率并不明显,低于50%。

3. SparseArray,二分法加上只能以int为key,性能较高。

以上所述是小编给大家介绍的Android开发性能优化总结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android开发仿扫一扫实现拍摄框内的照片功能

    就是仿照现在扫一扫的形式,周围是半透明的遮挡,然后中间是全透明的,拍摄后只截取框内的内容 查了很多博客,实现起来真的太复杂了,本人比较怕麻烦所以在很多地方偷懒了 先上效果图: 第一步:设置照相机预览以及拍照 这是所有步骤的前提,没有预览,用户怎么知道自己拍的什么呢.预览用的是SurfaceView 这篇博文写得已经十分详细了,打开照相机,然后拍照,而且十分简洁!不想别的博客一下就几百行代码不知所云.这篇代码可以复制下去当相机模版使用. 这里遇到一个问题,就是预览的效果是左转90度的,拍出来也是左

  • Android设计模式系列之单例模式

    单例模式,可以说是GOF的23种设计模式中最简单的一个. 这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本人很喜欢这个模式. android中很多地方都用到了单例模式,本文以输入法管理者InputMethodManager为例,展开分析. 单例模式,Singleton Pattern,能够以其特有的优势,替代系统中全局变量,应用非常广泛. 1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点

  • Android中用RxJava和ViewPager实现轮播图

    前言 很多人要实现轮播图都会想到使用ViewPager + Handler来完成轮播图的效果.但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了. 下面我们就来介绍如何实现RxJava+ViewPager的轮播图. 效果图如下 ViewPager的操作 说到ViwePager应该大家都不陌生,它可以结合普通的View也可以结合Fragment一起使用.在此我也就不对它的使用方法进行过多的介绍了.直接开始介绍轮播的方法. 常见的轮播操作 private

  • Android string-array数据源简单使用

    在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的arrays.xml文件里 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="city"> <item>厦门市</item> <item>福州市&l

  • Android this与Activity.this的区别

    写语句的时候有两种情况: Toast.makeText(AlarmActivity.this,"闹钟取消", Toast.LENGTH_SHORT); <pre name="code" class="java">Toast.makeText(this,"闹钟5秒后启动", Toast.LENGTH_SHORT); 用英文在google搜what's difference between this and Activ

  • Android设计模式系列之工厂方法模式

    工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式. android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具管理类. 今天以ThreadFactory举例说明一下简单工厂模式和工厂方法模式. 工厂方法模式,Factory Method,简单的方式,不简单的应用. 1.意图 定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方式模式使一个类的实例化延迟到其子类. 热门词汇:虚构造器 延迟 创建对象

  • Android设计模式系列之组合模式

    Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类. 组合模式,Composite Pattern,是一个非常巧妙的模式.几乎所有的面向对象系统都应用到了组合模式. 1.意图 将对象View和ViewGroup组合成树形结构以表示"部分-整体"的层次结构(View可以做为ViewGroup的一部分). 组合模式使得用户对单个对象View和组合对象ViewGrou

  • Android 对话框sweet-alert-dialog

    android原生的dialog太生硬了,之前看到了这个效果非常不错但是没有用过,今天给别人推荐使用,他遇到了问题,导入后错误非常多,也没有库工程.于是自己认真看了一下,这是个AndroidStudio的工程,并且里面还依赖于materialish-progress工程,也是个AS的工程.于是打算弄一个eclipse的版本并且将这两个工程融合在一起作为一个库工程XAlertDialogLibrary.使用时将其作为库导入项目中即可. 效果如下 使用起来非常简单,测试代码如下: MainActiv

  • Android 解决build path errors的问题

    新建一个eclipse-android项目后,如test2,从其它项目中拷贝若干个包到test2中, 在编译时总会出现以下错误: ?主要看第三条:The project cannot be built until build path errors are resolved 这个错误的原因是:AndroidManifest.xml中配置的主包名与AndroidManifest.xml 中配置的activtiy所在的包不一致造成的. 修改方法为: 1.在AndroidManifest.xml中找到

  • Android中的设计模式

    一般来说,常用的设计模式有以下八种:单例.工厂.观察者.代理.命令.适配器.合成.访问者 单例模式:目的是为了让系统中只有一个调用对象,缺点是单例使其他程序过分依赖它,而且不同单例运行在不同进程中,使得维护困难: 工厂模式:生产固定的一些东西,如抽象类,缺点是产品修改麻烦:如喜欢动作片和爱情片的人分别向服务器发出同一个请求,就可以得到他们想看的影片集,相当于不同对象进行同一请求,需求均得到满足. 观察者模式:就是多个对象对一个对象进行监控,如缓存: 代理模式:自己的事交给别人去做,分别返回结果即

随机推荐