android有关内存消耗的问题

来源:互联网 发布:开淘宝网店怎样装修 编辑:程序博客网 时间:2024/06/10 04:31

android程序如果发生内存消耗过大的话,会出现很严重的问题,内存消耗主要有几方面:

1,。注册对象未取消:假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在LockScreen中定义一个PhoneStateListener的对象,同时将它注册到TelephonyManager服务中。对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。

  但是如果在释放LockScreen对象的时候忘记取消我们之前注册的PhoneStateListener对象,则会导致LockScreen无法被垃圾回收。如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得system_process进程挂掉

2.资源对象没关闭:如数据库操作的Cursor 或是File文件操作。

3.不良的代码造成的:没有有效的对象没有释放,频繁的申请内存。

4.Bitmap对象没有用recycle()释放。Bitmap对象在不使用时,我们应该先调用recycle()释放内存。

5.构造Adapter时,没有使用缓存的 convertView。getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。

解决:

 View view = null;    4  5       if (convertView != null) {    6  7           view = convertView;    8  9           populate(view, getItem(position));   10 11           ...   12 13       } else {   14 15           view = new Xxx(...);   
判断covertview是否为空 不空就用 空了就new

6.慎用static:

 public class ClassName {  2 3       private static Context mContext;  4 5       //省略  6 7 }
复制代码

  以上的代码是很危险的,如果将Activity赋值到么mContext的话。那么即使该Activity已经onDestroy,但是由于仍有对象保存它的引用,因此该Activity依然不会被释放。

7.线程导致的内存:线程产生内存泄露的主要原因在于线程生命周期的不可控

8.使用软引用和弱引用:如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。说白了就是软引用:如果空间够大就继续用,直达到上限,不够大就回收(如定义Hashmap对象,再定义一个添加list里提供使用)而弱引用就是太大了 但还是想用,那么就把大的对象再进行一次声明对象让这个对象指向它,若之前对象null了,但弱引用对象指向的还可以用。

0 0