1: 先搞懂责任链是个啥?基于责任链搞清楚reponse okhttp 2:搞清楚拦截器, a 重试/重定向: b 桥拦截器:封装header属性 host keep-live gzip header 进行基本设置, c 缓存拦截器 d 连接拦截器 e CallServerInterceptor executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS, new SynchronousQueue(), Util.threadFactory("OkHttp Dispatcher", false)); SynchronousQueue 这个参数是线程池等待队列, 1:核心线程数 保持在线程池中的线程数量 2:线程池最大可容纳的线程数 3/4参数:当线程池中的线程数量大于核心线程数,空闲线程就会等待60s才会被终止,如果小于就会立刻停止; SynchronousQueue okhttp完全流程 1:OkHttpClient okHttpClient = new OkHttpClient.Builder() 构建一个okhttpClient对象,传入你想传入的对象,不传就是默认的; 2:构建request对象 Request request = new Request.Builder() 3:okHttpClient.newCall 实际上返回的realCall类 继续调用RealCall.newRealCall 4:调用enqueue方法,传入我们需要的回调接口,而且会判断, synchronized (this) { if (executed) throw new IllegalStateException("Already Executed"); executed = true; } 如果当前这个call对象已经被运行的话,则抛出异常; 5:继续调用dispatcher的enqueue方法,如果当前运行队列<64并且正在运行,访问同一个服务器地址的请求<5 就直接添加到运行队列,并且开始运行; 不然就添加到等待队列; 6:运行AsyncCall,调用它的execute方法 7:在execute方法中处理完response之后,会在finally中调用dispathcer的finished方法; 8:当当前已经处理完毕的call从运行队列中移除掉;并且调用promoteCalls方法 9:promoteCalls方法中进行判断, 如果运行队列数目大于等于64,如果等待队列里啥都没有,也直接return? 循环等待队列, 将等待队列中的数据进行移除,移除是根据运行队列中还能存放多少来决定; 移到了运行队列中,并且开始运行; 如何考虑app的安全性 1:使用https协议进行交互 2:数据交互时,根据业务分出哪些是敏感信息,凡是敏感信息使用对称加密方式,如果是类似密码的,则使用不可逆的加密方式;md5 3:考虑跟钱相关,或者同等重要的数据接口,需要做多重验证,比如:前端加密请求参数,合并请求参数生成MD5码,服务器端做多重认证,最好能对比本地数据库或者缓存之类的信息; 4:混淆, 5: app加固,dex文件进行加密,这种方式,可以通过”内存下载“,不安全,也只是为了增加破解难度; 6:将加密算法,一些核心数据添加到so文件中;