Android优化学习笔记

**1、 WebView控件 一定要注意清理缓存 destroy()方法 ,但是在这之前必须要调用removeAllViews()不然有时报错
2、线程:在退出活动窗口时一定要注意线程是否关闭、可以在debug查看线程的开启情况。PS:如果只要刷新UI线程建议使用Handler。
3、Sqlite:使用SQlite一定要注意 关闭当前指针和数据库连接
4、内存泄漏:对象在内存heap堆中中分配的空间,当不再使用或没有引用指向的情况下,仍不能被GC正常回收的情况。多数出现在不合理的编码情况下,比如在Activity中注册了一个广播接收器,但是在页面关闭的时候进行unRegister,就会出现内存溢出的现象。通常情况下,大量的内存泄漏会造成OOM。
OOM:即OutOfMemoery,顾名思义就是指内存溢出了。内存溢出是指APP向系统申请超过最大阀值的内存请求,系统不会再分配多余的空间,就会造成OOM error。在我们Android平台下,多数情况是出现在图片不当处理加载的时候。
5、善用:SoftReference/WeakReference/LruCache
Java、Android中有没有这样一种机制呢,当内存吃紧或者GC扫过的情况下,就能及时把一些内存占用给释放掉,从而分配给需要分配的地方。答案是肯定的,java为我们提供了两个解决方案。如果对内存的开销比较关注的APP,可以考虑使用WeakReference,当GC回收扫过这块内存区域时就会回收;如果不是那么关注的话,可以使用SoftReference,它会在内存申请不足的情况下自动释放,同样也能解决OOM问题。同时Android自3.0以后也推出了LruCache类,使用LRU算法就释放内存,一样的能解决OOM,如果兼容3.0一下的版本,请导入v4包。关于第二条的无关引用的问题,我们传参可以考虑使用WeakReference包装一下。
6、谨慎Handler
在处理异步操作的时候,handler + thread是个不错的选择。但是相信在使用handler的时候,大家都会遇到警告的情形,这个就是lint为开发者的提醒。handler运行于UI线程,不断处理来自MessageQueue的消息,如果handler还有消息需要处理但是Activity页面已经结束的情况下,Activity的引用其实并不会被回收,这就造成了内存泄漏。解决方案,一是在Activity的onDestroy方法中调用
handler.removeCallbacksAndMessages(null);取消所有的消息的处理,包括待处理的消息;二是声明handler的内部类为static。
7、BitMap:终极杀手
Bitmap的不当处理极可能造成OOM,绝大多数情况都是因这个原因出现的。Bitamp位图是Android中当之无愧的胖小子,所以在操作的时候当然是十分的小心了。由于Dalivk并不会主动的去回收,需要开发者在Bitmap不被使用的时候recycle掉。使用的过程中,及时释放是非常重要的。同时如果需求允许,也可以去BItmap进行一定的缩放,通过BitmapFactory.Options的inSampleSize属性进行控制。如果仅仅只想获得Bitmap的属性,其实并不需要根据BItmap的像素去分配内存,只需在解析读取Bmp的时候使用BitmapFactory.Options的inJustDecodeBounds属性。最后建议大家在加载网络图片的时候,使用软引用或者弱引用并进行本地缓存,推荐使用android-universal-imageloader或者xUtils,牛人出品,必属精品。前几天在讲《自定义控件(三) 继承控件》的时候,也整理一个,大家可以去Github下载看看。
8、BroadCastReceiver、Service
绑定广播和服务,一定要记得在不需要的时候给解绑。
9、 I/O流
I/O流操作完毕,读写结束,记得关闭。
10、Java内存控制
对于字符串操作而言如果需要连加这样的操作建议使用StringBuilder,经过调试不难发现如果你的字符串每次连加,使用String需要的内存开销会远大于StringBuilder,然后Android手机常规的运行内存大约在128MB左右,对于运行多任务就需要考虑了,Android开发网提示因为Java有GC不需要手动释放那么分配的时候就要格外的小心,频繁的GC操作仍然是很影响性能的,在调试时我们可以通过logcat查看内存释放情况。
Android代码优化的核心原则:不做不必要的事,不分配不必要的内存
1、字符串频繁操作时,多用StringBuffer而少用String
2、尽量使用本地变量,即反复使用的变量要先保存成临时或局部变量,尤其是循环中使用的变量
3、String方法中substring和indexOf都是native方法可以大量的使用
4、如果函数返回String类型,而且返回后的使用就是要加入到StringBuffer此时可以直接传入StringBuffer
5、用两个一维数组代替二维数组 int[][]=====int[] int[]
6、如果返回直接类型足够了,就不应返回接口类型如假如返回Hashmap就足够了,请不要返回Map
7、如果一个方法不访问(不修改)成员变量,请用static方法
8、尽量不用getters和setters,如果你非要用的话请加上final关键字,编译器会把它当成内联函数
9、永远不要在for循环第二个参数中使用方法调用
10、不修改的static变量请用static final常量代替
11、foreach可以用来处理数组和arraylist,如果处理其他对象相当于Iterator
12、避免使用枚举,请使用常量代替
13、慎用浮点数 float尤其是大量的数学运算
14、不使用的引用变量要手动置null,提高内存被回收的几率
15、慎用图片操作,使用后要立即释放资源**

你可能感兴趣的:(android,缓存,优化,学习,随手笔记)