一。内存优化的方法就是:
1.降低运行时内存,2.代码优化,3.内存泄漏优化
(一)。降低运行时内存
1. 减少apk体积 : 就是去除无用的资源和代码,尽量去复用资源,对一些分辨率大的图片进行压缩,简化so库
2.BitMap优化: 统一的bitmap加载器,选择Glide,Fresco,Picasso中的一个作为图片的加载框架,在开发中加载到View的图片的大小不应该超过View的大小,应为图片加载宽会对图片进行缓存,按照View的实际大小加载。一般在开发中为了减少apk的大小会脂肪一套3X图片,但是这些图片在小的分辨率的手机上就会出现内存浪费,所以统一的加载器就可以解决
(二)。代码优化
1.使用更加轻量的数据结构
2.避免在onDraw,getView方法里面创建对象,尽量是去复用它
(三),内存泄漏优化
内存泄漏就是:当activity销毁后,gc在回收时不能被回收,发现activity已经被其他对象持有了该方法,这时就出现内存泄漏
如果内存泄漏太多导致程序没有办法去申请内存,就会出现内存溢出
1.Activity的泄漏:应为在Activity中调用了finish,但是引用了Activity的对象最后没有被释放,这时ActivityContext被传递到其他势力中去了,这时就有可能导致自身被引用导致
2.除了可以使用Activity的Context还可以使用Aplication的Context来避免Activity的泄漏
3.大多数情况下,会对Bitmap对象增加缓存机制,但是有时候部分的bitmap需要及时的回收,就比如临时创建的某个相对大的bitmap对象,变换得到的新的bitmap对象后,尽快回收原始的bitmao ,及时释放原来的空间。
4.单利造成的内存泄漏
应为在使用单利的时候,经常会传入一个本类的上下文对象,而单利是静态的,生命周期和application一样长,当activity销毁的时候。该单利持有了activity的引用导致其不能被回收,这个时候就出现内存泄漏
解决方法:在使用上下文的时候,传一个全局上下文
5.handler耗时引发的内存泄漏
当activity中存在handler接收耗时消息,在消息还没有发送完成的时候,activity就关闭了页面,这时activity已经执行了onDestory方法,当gc回收的时,activity不能被回收,这时就出现了内存泄漏
解决方法:当activity被销毁的时候,调用他的移除消息任务,将对象和线程清空
6.内部类引发的内存泄漏
应为Java当中,内部类默认持有对外部类的引用,所以在当外部l类被销毁后,一旦gc去回收时发现内部类持有了对外部类的引用,导致gc不能被回收,这个时候就导致了内存泄漏
解决方法:将内部类改为静态内部类,所以在当退出程序的时候它会一同去回收它,这样就不会影响外部类的回收
(四)。内存溢出
内存溢出就是在App运行时占用的内存超出系统分配给该App的内存,就会出现内存溢出
造成内存溢出的原因就是在加载大量的图片时没有及时去回收和释放内存
(五),内存抖动
内存抖动就是在短时间内能去分配对象和回收对象,就是内存抖动
避免内存抖动就是
(1)尽量避免在循环体内去创建对象,应该把它创建到循环体外
(2).不要在自定义View的onDraw()方法中频繁去调用
二,布局优化
1.选择耗费性能较少的布局:
性能耗费低的布局==功能简单==LinearLayout,FramLayout
性能耗费高的布局 ==功能复杂 == RelativeLayout
宁愿选择一个性能耗费高的布局也不选择一个嵌套多个耗费性能低的布局
2.使用布局标签<merge>合适选择布局的类型,减少布局的嵌套
3.提高布局的复用性,主要是减少测量和绘制的时间使用include
三。绘制优化
过度绘制:屏幕上的某一像素点被多次重复绘制
优化:
①:优化视图结构,减少布局层级
②:去除不需要的布局
四。启动优化
在默认的情况下,在启动应用的时候胡出现启动空白窗口,直到Activity创建成功后才会进入启动页面
在优化后就会解决窗口黑白屏的问题,但不会彻底的去解决
APP启动:在Launch界面点击APP图标到加载完成第一个activity为止是APP的启动,第二次启动会比第一次启动要快很多,所以启动就分为冷启动和热启动
冷启动:
就是指当启动应用时,系统后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用 冷启动应为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,在去创建和初始化Activity
热启动:
就是当启动应用时,后台已经有了该 应用的进程,就比如说是按了back键 ,应用虽然是退出了但是进程还是在后台的是依然保留的,所以说在次启动就是热启动,会快很多,而且热启动是不会走application类的
每次冷启动的时长比热启动的时长大,应为热启动不会走application
首次启动 :
也是冷启动的一种情况,应为首次启动比冷启动的启动时长要长一点,首次启动需要做一些系统初始化工作,比如缓存目录的生产,数据库的建立,sharedPreference的初始化,如果存在多个dex和插件的情况下,首次启动会做一些别的处理。
首次启动比冷启动的时间久
电量优化
消耗电量主要就是:大数据的网络传输,不停的网络切换,解析大量的数据
1.在充电时执行任务
为了省电有些是可以在手机插上电源后去执行的,判断手机现在是否是充电状态
2.连接无线上网后执行任务
一般无线网络会比移动网络消耗的电量比较少,应该尽量去减少在移动网络线的数据传输,多在无线网络去进行数据的传输,所以可以把一些不需要着急处理的数据传输留在无线网络后去执行
流量优化
1.局部更新,分页加载
2.尽量去避免客户端轮询,采用服务端推送方式