Fighting!

潜行者的沉默

Android中AOP应用

在Android开发中,有很多知名的开源框架在使用AOP思想。例如ButterKnife,Retrofit,Hugo等。AOP可以做性能检测和埋点技术也有很多

  1. 性能检测和优化,360的ArgusAPM,滴滴的booster,Hugo
  2. 埋点技术,逻辑思维的DDAuto Tracker, 网易的HubbleData
  3. 通过AOP技术,还可以在我们向服务器请求数据时,会显示一个Loding,结果返回后隐藏它,可以通过AOP技术将Loading动作与业务主体分离
  4. Android的权限管理Aopermission

UML

UML是一种可视化的面向对象的建模语言,可以用来描述系统的静态结构和动态行为。用得最多的是类图,时序图,用例图。

类图

类图中类是对象的集合,用来描述类的对象结构类及与类,系统之间的交互关系

  1. 泛化关系(表现为is a):实线加指向父类或接口的空心箭头,包括类与类的继承,接口与接口的继承,类对接口的实现.
  2. 实现抽象:虚线+指向抽象的类的空心箭头
  3. 聚合关系:不是强依赖关系,用实线+空心菱形箭头指向依赖对象,公司和员工的关系
  4. 组合关系:强依赖关系(共存),用实线+实心菱形箭头指向依赖对象,公司和部门的关系,同时创建,同生命周期
  5. 依赖关系:通过入参依赖,用虚线+实心箭头,体现为局部变量,方法参数或者静态调用方法
  6. 关联关系(has a):一个类知道另一个类的属性和方法,是另一个类的全局变量
    阅读全文 »

阿里开源项目启动框架Alpha

前面已经介绍了它的原理是基于PERT技术实现的。将一个项目过程以任务单元合理的安排资源,有些任务存在依赖关系所以执行顺序是定死的,但有些任务可以是脱离顺序,可以从关键任务路径中拎出来并行,从而一个项目的耗时及资源占比最大的任务即关键任务路径,在保证项目质量的前提下,可以对关键任务路径上的任务进行优化,也可以从次要任务优化,使关键任务资源充足,达到优化整体项目的效果。下面介绍关键代码类及点

Task

任务即项目的执行单元,任务包含的元素

  1. 任务的状态:空闲(idle),正在执行(runing),结束(finish),等待(wait)
  2. 任务优先级:线程是有限的,对于同一时机的任务,其执行顺序也是有先后顺序的
  3. 任务执行所在线程的优先级,对于优先级高的可以分配到更多的cpu时间
  4. 任务执行的线程:1.线程池子线程;2.主线程
  5. 任务名和任务的监听器对象集合
  6. 任务的关联关系:1.前驱任务集合,2.后继任务集合。执行顺序
  7. 当然可以添加监控器,监控任务的执行情况(任务耗时)
    阅读全文 »

Https的用途和工作模式

用Http协议看新闻没什么问题,但换到严肃的场景中就存在安全风向了,如支付,使用普通的Http协议就会被黑客盯上。通过拦截请求假装自己是服务器,让你输入密码等。解决这种问题的思路是对数据加密,加密方式分两种:

对称加密

在对称加密中,加密解密都使用相同的秘钥,因此秘钥的保密工作需要做好,只能给使用的人知道,存在问题

  • 秘钥的约定时机,秘钥通过互联网传输一样会被黑客截获

非对称加密

加密和解密使用的秘钥不相同。分公钥和私钥,且公钥加密只能私钥解密,反之亦然。对称加密会存在秘钥约定十几的问题,所以需要非对称加密介入。将非对称加密的公钥公开,私钥自己保留。同样存在问题

  • 服务器的回复数据,黑客可以通过公钥解密,且黑客也可以模拟发送请求,所以一对公钥私钥不够,客户端同样需要有自己的公钥和私钥,并且客户端的公钥给服务端
    阅读全文 »

什么是Gradle

Gradle是一个开源的,非常灵活的自动化构建工具,具有以下几大特点:

  1. 高性能:只执行定义的任务,可以复用任务的输入输出,避免不必要的执行
  2. 基于JVM:可以利用java,Kotlin,Groovy等编译器支持的语言
  3. 定制了基础框架,便于构建
  4. 扩展性:可以自定义任务
  5. 编辑器的支持

设计Gradle插件

1. 总体架构
  1. 提取可用的逻辑编写成二进制插件
  2. 插件对性能的影响
  3. 定制规范,减少配置
  4. 将功能与规范隔离
2. 技术
  1. 使用静态语言编写插件
  2. 尽量通过Gradle内部的ApI实现插件
  3. 3 减少外部依赖

一. 曾经的网络框架

Android的网络框架有四种
  1. HttpClient : 2.2版本以下存在bug,所以2.3之后建议使用HttpUrlConnection
  2. HttpUrlConnection 2.3+, 官方推荐
  3. Volley,谷歌开发,简单的网络任务框架,底层兼容2.3以前版本使用了HttpClient,2.3+使用的是HttpUrlConnection,功能拓展性弱
  4. Okhttp,从Android4.4开始HttpURLConnection的底层实现采用的是okHttp.
优缺点


通过上面的比较,在Android发展的每个阶段,他们有各自存在的意义,只是时过境迁,被种种原因被替换或者废弃。
这个过程是一个框架发展的过程,从重量级繁杂且难以维护,到轻量级易扩展,到过度版本新老版本的兼容,最后取长补短完善自己的网络框架。
化繁为简,然后又能包容万象的过程

网络框架应该有的功能
  1. 自定义请求的Header
  2. GET,POST
  3. 支持文件上传下载
  4. 图片加载
  5. 支持多任务网络请求操作
  6. 支持缓存
  7. 支持回调
  8. 支持session
  9. …..

二. OkHttp简介

一张图了解OkHttp的整个过程

在OkHttp中真正核心的东西是Interceptor,他不仅负责拦截请求进行额外的处理(入cookie),实际上他还会把实际的网络请求,缓存,透明压缩等功能都统一起来,每一个功能都只是一个Interceptor,它们在连接成一个Interceptor.Chain,环环相扣最终完成一次网络请求,从getResponseWithInterceptorChain函数中我们可以看到Interceptor.Chain的分布情况依次是:

  1. 在配置OkHttpClinet时设置的interceptors
  2. 负责失败重试和重定向的RetryAndFollowUpInterceptor
  3. 负责把用户构造的请求转化为发送到服务器的请求,把服务器返回的响应转化为用户友好的响应BridgeInterceptor
  4. 负责读取缓存直接返回,更新缓存的CacheInterceptor
  5. 负责和服务器建立连接的ConnectInterceptor
  6. 配置OkHttpClient时设置的NetworkInterceptor
  7. 负责向服务器发送请求数据,从服务器读取响应数据的CallServerInterceptor

在这里位置决定了功能,最后一个一定是CallServerInterceptor,其他的在这之前。责任链模式在Interceptor中得到了很好的实践。对于request变成response对象,每个interceptor都能完成这件事,也由各自的inteceptor决定是否要交给下个interceptor。

三. Interceptor分析

首先看分析ConnectInterceptor和CallServerInterceptor,这两个interceptor实现了和服务器进行通信的核心

1. ConnectInterceptor建立连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** Opens a connection to the target server and proceeds to the next interceptor. */

@Override
public Response intercept(Chain chain) throws IOException {
RealInterceptorChain realChain = (RealInterceptorChain) chain;
Request request = realChain.request();
Transmitter transmitter = realChain.transmitter();

// We need the network to satisfy this request. Possibly for validating a conditional GET.
boolean doExtensiveHealthChecks = !request.method().equals("GET");
Exchange exchange = transmitter.newExchange(chain, doExtensiveHealthChecks);

return realChain.proceed(request, transmitter, exchange);
}

通过创建一个Exchange对象,他将在后面使用。他的内部是对http,https请求的实现,内部都是利用Okio对Socket的读写操作进行了封装.在内部是对java.io和java.nio进行了封装,内部创建了一个主要的RealConnectionn对象,利用RealConnectionn进行读写

2. CallServerInterceptor 发送和接受数据

主要过程:

  1. 向服务器发送request header
  2. 如果有request body,就向服务器发送
  3. 读取response header, 构造response 对象
  4. 如果有response body,则创建一个带body的response对象
3. CacheIntercepter 缓存

在建立连接,和服务器通讯之前就是CacheIntercepter,我们需要检查响应是否已经本地缓存了,如果缓存了则直接返回,否则进行后面的流程,并把返回的数据写入缓存

  1. 获取本地缓存cacheCandidate
  2. 如果本地缓存可用则直接返回CacheCandidate,从而打断interceptor链
  3. 走剩下的interceptor获取nnetworkResponse
  4. networkResponse、cacheResponse构造新的response
  5. 根据新的response里的header定制缓存策略,存入缓存中(method 为get)

总结

创建一个单例的OkHttpClient,创建请求对象request,初始化请求方式,请求url,请求header,请求body,然后通过client的newcall(request)构建真正的请求对象realcall。有realcall的execute方法和qnqueue方法区分是同步请求还是异步请求,异步请求依赖线程池dispatcher,最终会调用getResponseWithInterceptorsChain方法返回返回response。内部通过这种拦截器对request请求数据和response响应数据进行处理,每个拦截器直接通过realinterceptchain对象的process连接起来(责任链模式)

毕业在即,我也在二维火实习了近半年时间,随着对产品和公司的了解我决定将继续留在公司学习,想在未来的某一天看着自己参与或者做的项目投入市场,得到大家的认可。

火种培训

火种:二维火的种子(实习生),年轻,活力。星星之火可以燎原。

第一天 2018/6/20

  • 红烧肉:产品研发负责人《开篇介绍》
    给我们介绍了公司的使命,愿景,价值观等。聊了聊公司的发展历程以及在公司多年来的经历,给了我们一些切身的建议:每个月看书,写日记 todolist等
  • 人参果:产品委员会主席《公司产品介绍》
    细致的讲述了公司的价值观:正直善良,敬畏之心,天道酬情!
    讲述了公司在10几年间,产品的迭代更替以及公司的主要产品线(排队,扫码点餐,厨房KDS,收银,供应链,掌柜等等)
    阅读全文 »

Android跨进程通讯的几种方式

Bundle

Bundle实现了Parcelable,方便在进程中传输数据。主要在activity、service、receiver中Intent中应用,

文件共享

Android基于Linux,对文件的读写没有限制。存在的问题就是并发读写的问题
sp存在缓存策略,内存中存在备份,导致多进程不可靠

使用messenger信使

  1. Messenger可以在不同的进程中传递Message对象,轻松实现数据的跨进程通讯。
  2. 它的底层实现是AIDl,内部一次只做一次处理,因此服务端不用考虑线程同步的问题
  3. 缺点是只能用来简单的信息传递,并发请求不大合适且无法不支持跨进程的方法的调用
    Alt text
0%