Android 网络异常优化

01.网络请求异常分类

  • 网络请求异常大概有哪些?
    • 第一种:访问接口异常,比如404,500等异常,出现这类异常,Retrofit会自动抛出异常。
    • 第二种:解析数据异常,数据体发生变化可能会导致这个问题。
    • 第三种:其他类型异常,比如服务器响应超时异常,链接失败异常,网络未连接异常等等。
    • 第四种:网络请求成功,但是服务器定义了异常状态,比如token失效,参数传递错误,或者统一给提示(这个地方比较拗口,比如购物app,你购买n件商品请求接口成功,code为200,但是服务器发现没有这么多商品,这个时候就会给你一个提示,然后客户端拿到这个进行吐司)
阅读更多

Android 注解替代枚举

01.使用注解限定传入类型

  • 使用注解限定传入类型

    • 比如,尤其是写第三方开源库,对于有些暴露给开发者的方法,需要限定传入类型是有必要的。举个例子:

    • 刚开始的代码

      1
      2
      3
      4
      5
      6
      7
      8
      9
      /**
      * 设置播放器类型,必须设置
      * 注意:感谢某人建议,这里限定了传入值类型
      * 输入值:111 或者 222
      * @param playerType IjkPlayer or MediaPlayer.
      */
      public void setPlayerType(int playerType) {
      mPlayerType = playerType;
      }
阅读更多

Android 轮询操作优化

01.轮询操作是啥

  • 什么叫轮训请求?
    • 简单理解就是App端每隔一定的时间重复请求的操作就叫做轮训请求,比如:App端每隔一段时间上报一次定位信息,App端每隔一段时间拉去一次用户状态等,这些应该都是轮训请求。
  • 为何不用长连接代替轮训操作?
    • 长连接并不是稳定的可靠的,而执行轮训操作的时候一般都是要稳定的网络请求,而且轮训操作一般都是有生命周期的,即在一定的生命周期内执行轮训操作,而长连接一般都是整个进程生命周期的,所以从这方面讲也不太适合。
阅读更多

Android 对象池 Pools 优化

01.什么时对象池

  • 对象池作用
    • 在某些时候,我们需要频繁使用一些临时对象,如果每次使用的时候都申请新的资源,很有可能会引发频繁的 gc 而影响应用的流畅性。这个时候如果对象有明确的生命周期,那么就可以通过定义一个对象池来高效的完成复用对象。
  • 对象池使用场景
    • glide中对加载图片时频繁创建对象使用到了对象池。

02.glide使用对象池

阅读更多

Android App 卡顿原因

01.Android卡顿原理

  • 通过对Android绘制机制的了解,我们知道造成应用卡顿的根源就在于16ms内不能完成绘制渲染合成过程,因为Android平台的硬件刷新率为60HZ,大概就是16ms刷新一次。如果没能在16ms内完成这个过程,就会使屏幕重复显示上一帧的内容,即造成了卡顿。在这16ms内,需要完成视图树的所有测量、布局、绘制渲染及合成。而我们的优化工作主要就是针对这个过程的。

02.复杂的视图树

阅读更多

Android APP 瘦身优化

1.APK组成

1.1 APK组成部分

  • 如下所示
    • res:包含未编译到的资源 resources.arsc,主要有图片资源文件;
    • classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类;
    • assets:包含应用可以使用AssetManager对象检索的应用资源;
阅读更多

Android 静态变量优化

01.为啥不要用静态变量保存核心数据

  • 尽量不使用静态变量保存核心数据。这是为什么呢?
    • 这是因为android的进程并不是安全的,包括application对象以及静态变量在内的进程级别变量并不会一直呆着内存里面,因为它很有会被kill掉。
    • 当被kill掉之后,实际上app不会重新开始启动。Android系统会创建一个新的Application对象,然后启动上次用户离开时的activity以造成这个app从来没有被kill掉的假象。而这时候静态变量等数据由于进程已经被杀死而被初始化,所以就有了不推荐在静态变量(包括Application中保存全局数据静态数据)的观点。
阅读更多

Android 图片优化

01.bitmap优化

  • 加载图片所占的内存大小计算方式
    • 加载网络图片:bitmap内存大小 = 图片长度 x 图片宽度 x 单位像素占用的字节数【看到网上很多都是这样写的,但是不全面】
    • 加载本地图片:bitmap内存大小 = width * height * nTargetDensity/inDensity 一个像素所占的内存。注意不要忽略了一个影响项:Density
  • 第一种加载图片优化处理:压缩图片
阅读更多

Android App 启动页优化

01.存在白屏问题

1.1 问题描述

  • 出现问题描述
    • android app启动页面黑屏的问题,android开发app启动时若没有做特殊处理的话,会出现一瞬间的白屏现象。
    • 即使你启动页界面就加载一个布局,不做其他耗时处理,貌似也会出现一瞬间的白屏问题。注意,有些地方也称黑屏,主要是看你给app设置的style样式。
阅读更多

Android App 线程优化

01.创建Thread弊端

  • 直接创建Thread实现runnable方法的弊端
    • 大量的线程的创建和销毁很容易导致GC频繁的执行,从而发生内存抖动现象,而发生了内存抖动,对于移动端来说,最大的影响就是造成界面卡顿
    • 线程的创建和销毁都需要时间,当有大量的线程创建和销毁时,那么这些时间的消耗则比较明显,将导致性能上的缺失

02.为何要用线程池

阅读更多