现实开发中用到的性能优化方案
归纳如下:
Android的内存优化可谓是优化中的重头戏啊,为啥嘞?因为内存太金贵了比柴米油盐贵多了.其实刚开始做Android的时候根本不在乎这些,没错一点不在乎.产品设计出来,UI出了图,不管他三七二十一,七十二变的上代码完成功能就完事了,现在想想真的好不负责任啊,宛如一个渣男!!不过好在悬崖勒马,没有放任下去不管,慢慢的开始重视起来.其实能内存优化也就那几个方面,可能总结的的不算完美,但也是尽心尽力,大致有以下几个方面:
一.内存泄漏 内存泄漏大致会出现在如下几个点
① 不正确的使用单例模式-----有的单例中需要传入上下文,由于单例模式中方法和对象是static的生命周期和应用是一样的,当我们传入的上下文是当前activity的时候,退出activity却回收不掉,就会引起内存泄漏.解决方法呢:就是在单例模式中把当前上下文换成ApplicationContext或者content.getgetApplicationContext(),因为这两个的生命周期是和应用一样的 这样就不会导致内存泄漏了.
② 非静态内部类,非静态匿名内部类----java中设计只要是非静态的就会持有外部类的强引用,比如实现一个Thread内部会有run方法,当你的activity停止了但是run方法还没有执行完,这就会导致内存泄漏,解决办法:第一种是把内部类设为静态内部类,第二种是把要传入的activity给弱引用
③ Handler----其实handler引起的内存泄漏和非静态内部类一样,解决方法也一样 不过还可以多一种方法就是在activity的onDestroy()中调用mHandler.removeCallbacksAndMessages(null);
④ 静态变量 ---静态的生命周期都是和应用的周期是一样的 所以静态变量也不例外,比如intent跳转的时候需要传递参数如果你的tag是在activity中写的静态变量,那肯定会内存泄漏,解决方法:新建一个全局的类 里面放置这些常量
⑤ 资源未关闭---比如一些读写的io流使用完后没有及时关闭,解决方法:记得关闭流
⑥ 一些监听未取消--比如使用eventbus,glide使用后为及时取消注册监听.解决办法:在onDestroy中及时取消
⑦ 使用AsyncTask---其实现在用异步的不多了因为rxjava太好用了 解决办法:和内部类差不多设为静态就行了
⑧ bitmap---使用完没有recycle 解决办法:关闭页面时调用recycle()
⑨ webview---关于WebView的内存泄露,因为WebView在加载网页后会长期占用内存而不能被释放,解决办法:Activity销毁后要调用它的destory()方法来销毁它以释放内存。
⑩ 属性动画--引起内存泄漏主要是因为我们在activity中调用了属性动画,在页面关闭时却没有调用cancle方法,导致动画还在占着内存一直播放,所以呢解决办法:就是在activity销毁的时候调用cancle
11 集合中的对象未清理---如果一个对象放入到集合中,这个集合就会持有该对象的引用。当我们不再需要这个对象时,也并没有将它从集合中移除,这样只要集合还在使用(而此对象已经无用了),这个对象就造成了内存泄露。并且如果集合被静态引用的话,集合里面那些没有用的对象更会造成内存泄露了。解决办法:在使用集合时要及时将不用的对象从集合remove,或者clear集合,以避免内存泄漏。
二.内存溢出也就是OOM
其实内存溢出的本质就是内存泄漏,除了内存泄漏引起的内存溢出外还有就是
① 对象内存过大 比如bitmap--解决这个问题的关键点在于bitmap的压缩
三,代码中的注意细节
比如多使用一些优化过的数据结构--使用ArrayMap/SparseArray来代替HashMap,ArrayMap/SparseArray是专门为移动设备设计的高效的数据结构; 尽量少使用枚举;少使用string进行字符串拼接(可以用StringBuffer或者StringBuilder代替String);少使用递归
好啦 就到这里吧
网友评论