Android新能优化之内存优化篇

(1)单例持有对象

    解决:使用全局的context,防止使用activity的context

(2)静态变量持有对象

    解决:少使用静态变量,用完后适当置为null

(3)非静态内部类

    非静态内部类(包括匿名内部类)默认就会持有外部类的引用,当非静态内部类对象的生命周期比外部类对象的生命周期长时,就会导致内存泄露。
    Handler
    解决:弱引用方式
                Activity销毁时就将mHandler的回调和发送的消息给移除掉。

    非静态内部类造成内存泄露还有一种情况就是使用Thread或者AsyncTask。处理情况类似,弱引用方式。

(4)未取消注册或回调导致内存泄露,同上面所说的非静态内部类一样持有Activity引用

    解决:广播在activity中注册,需要activity销毁时解注册。

(5)集合中的对象未清理造成内存泄露

    如果一个对象放入到ArrayList、HashMap等集合中,这个集合就会持有该对象的引用。当我们不再需要这个对象时,也并没有将它从集合中移除。
    解决:及时将不用的对象从集合remove,或者clear集合

(6)资源未关闭或释放导致内存泄露

    IO、File流或者Sqlite、Cursor,这些资源在进行读写操作时通常都使用了缓冲。
    解决:使用完后关闭

(7)属性动画造成内存泄露

    在销毁的时候,没有调用cancle方法,虽然我们看不到动画了,但是这个动画依然会不断地播放下去,动画引用所在的控件,所在的控件引用Activity,这就造成Activity无法正常释放。
    解决:在Activity销毁的时候cancel掉属性动画,避免发生内存泄漏。

(8)Webview的内存处理

webview消耗内存较大,并且持有activity的引用,activity关闭的时候destory webview。

总结:
构造单例的时候尽量别用Activity的引用;
静态引用时注意应用对象的置空或者少用静态引用;
使用静态内部类+软引用代替非静态内部类;
及时取消广播或者观察者注册;
耗时任务、属性动画在Activity销毁时记得cancel;
文件流、Cursor等资源及时关闭;

猜你喜欢

转载自blog.csdn.net/wjh823177094/article/details/80134586