Android 优化总结( 五 )


4.6 Activity不可见优化
当Activity界面不可见时释放内存当用户打开了另外一个程序 , 我们的程序界面已经不可见的时候 , 我们应当将所有和界面相关的资源进行释放 。重写Activity的onTrimMemory()方法 , 然后在这个方法中监听TRIM_MEMORY_UI_HIDDEN这个级别 , 一旦触发说明用户离开了程序 , 此时就可以进行资源释放操作了 。当时看到这个觉得很新奇的 , 但是具体还是没有用到 , 要是那个大神有具体操作方案 , 可以分享一下 。
4.7 节制的使用Service
节制的使用Service如果应用程序需要使用Service来执行后台任务的话 , 只有当任务正在执行的时候才应该让Service运行起来 。当启动一个Service时 , 系统会倾向于将这个Service所依赖的进程进行保留 , 系统可以在LRUcache当中缓存的进程数量也会减少 , 导致切换程序的时候耗费更多性能 。我们可以使用IntentService , 当后台任务执行结束后会自动停止 , 避免了Service的内存泄漏 。
5.网络优化5.1 图片分类
图片网络优化比如我之前看到豆瓣接口 , 提供一种加载图片方式特别好 。接口返回图片的数据有三种 , 一种是高清大图 , 一种是正常图片 , 一种是缩略小图 。当用户处于wifi下给控件设置高清大图 , 当4g或者3g模式下加载正常图片 , 当弱网条件下加载缩略图【也称与加载图】 。简单来说根据用户的当前的网络质量来判断下载什么质量的图片(电商用的比较多) 。豆瓣开源接口可以参考一下!
5.2 获取网络数据优化
移动端获取网络数据优化的几个点连接复用:节省连接建立时间 , 如开启 keep-alive 。对于Android来说默认情况下HttpURLConnection和HttpClient都开启了keep-alive 。只是2.2之前HttpURLConnection存在影响连接池的Bug , 具体可见:Android HttpURLConnection及HttpClient选择请求合并:即将多个请求合并为一个进行请求 , 比较常见的就是网页中的css Image Sprites 。如果某个页面内请求过多 , 也可以考虑做一定的请求合并 。减少请求数据的大小:对于post请求 , body可以做gzip压缩的 , header也可以做数据压缩(不过只支持http返回数据的body也可以做gzip压缩 , body数据体积可以缩小到原来的30%左右 。(也可以考虑压缩返回的json数据的key数据的体积 , 尤其是针对返回数据格式变化不大的情况 , 支付宝聊天返回的数据用到了)
5.3 网络请求异常拦截优化
在获取数据的流程中 , 访问接口和解析数据时都有可能会出错 , 我们可以通过拦截器在这两层拦截错误 。
@Overridepublic void onError(Throwable e) { //直接调用即可 ExceptionUtils.handleException(e);}1.在访问接口时 , 我们不用设置拦截器 , 因为一旦出现错误 , Retrofit会自动抛出异常 。比如 , 常见请求异常404 , 500 , 503等等 。2.在解析数据时 , 我们设置一个拦截器 , 判断Result里面的code是否为成功 , 如果不成功 , 则要根据与服务器约定好的错误码来抛出对应的异常 。比如 , token失效 , 禁用同账号登陆多台设备 , 缺少参数 , 参数传递异常等等 。3.除此以外 , 为了我们要尽量避免在View层对错误进行判断 , 处理 , 我们必须还要设置一个拦截器 , 拦截onError事件 , 然后使用ExceptionUtils , 让其根据错误类型来分别处理 。具体可以直接看lib中的ExceptionUtils类 , 那么如何调用呢?入侵性极低 , 不用改变之前的代码!
6.线程优化6.1 使用线程池
将全局线程用线程池管理参考:轻量级线程池封装库 , 支持异步回调 , 可以检测线程执行的状态该项目中哪里用到频繁new Thread保存图片[注意 , 尤其是大图和多图场景下注意耗时太久];某些页面从数据库查询数据;设置中心清除图片 , 视频 , 下载文件 , 日志 , 系统缓存等缓存内容使用线程池管理库好处 , 比如保存图片 , 耗时操作放到子线程中 , 处理过程中 , 可以检测到执行开始 , 异常 , 成功 , 失败等多种状态 。RxJava , RxAndroid , 底层对线程池的封装管理特别值得参考重用线程池中的线程 , 避免频繁地创建和销毁线程带来的性能消耗;有效控制线程的最大并发数量 , 防止线程过大导致抢占资源造成系统阻塞;可以对线程进行一定地管理 。大量的线程的创建和销毁很容易导致GC频繁的执行 , 从而发生内存抖动现象 , 而发生了内存抖动 , 对于移动端来说 , 最大的影响就是造成界面卡顿线程的创建和销毁都需要时间 , 当有大量的线程创建和销毁时 , 那么这些时间的消耗则比较明显 , 将导致性能上的缺失直接创建Thread实现runnable方法的弊端为什么要用线程池使用线程池管理的经典例子关于线程池 , 线程 , 多线程的具体内容


推荐阅读