8月6日
UML
UML是一种可视化的面向对象的建模语言,可以用来描述系统的静态结构和动态行为。用得最多的是类图,时序图,用例图。
类图
类图中类是对象的集合,用来描述类的对象结构类及与类,系统之间的交互关系
- 泛化关系(表现为is a):实线加指向父类或接口的空心箭头,包括类与类的继承,接口与接口的继承,类对接口的实现.
- 实现抽象:虚线+指向抽象的类的空心箭头
- 聚合关系:不是强依赖关系,用实线+空心菱形箭头指向依赖对象,公司和员工的关系
- 组合关系:强依赖关系(共存),用实线+实心菱形箭头指向依赖对象,公司和部门的关系,同时创建,同生命周期
- 依赖关系:通过入参依赖,用虚线+实心箭头,体现为局部变量,方法参数或者静态调用方法
- 关联关系(has a):一个类知道另一个类的属性和方法,是另一个类的全局变量
8月4日
阿里开源项目启动框架Alpha
前面已经介绍了它的原理是基于PERT技术实现的。将一个项目过程以任务单元合理的安排资源,有些任务存在依赖关系所以执行顺序是定死的,但有些任务可以是脱离顺序,可以从关键任务路径中拎出来并行,从而一个项目的耗时及资源占比最大的任务即关键任务路径,在保证项目质量的前提下,可以对关键任务路径上的任务进行优化,也可以从次要任务优化,使关键任务资源充足,达到优化整体项目的效果。下面介绍关键代码类及点
Task
任务即项目的执行单元,任务包含的元素
- 任务的状态:空闲(idle),正在执行(runing),结束(finish),等待(wait)
- 任务优先级:线程是有限的,对于同一时机的任务,其执行顺序也是有先后顺序的
- 任务执行所在线程的优先级,对于优先级高的可以分配到更多的cpu时间
- 任务执行的线程:1.线程池子线程;2.主线程
- 任务名和任务的监听器对象集合
- 任务的关联关系:1.前驱任务集合,2.后继任务集合。执行顺序
- 当然可以添加监控器,监控任务的执行情况(任务耗时)
8月3日
Https的用途和工作模式
用Http协议看新闻没什么问题,但换到严肃的场景中就存在安全风向了,如支付,使用普通的Http协议就会被黑客盯上。通过拦截请求假装自己是服务器,让你输入密码等。解决这种问题的思路是对数据加密,加密方式分两种:
对称加密
在对称加密中,加密解密都使用相同的秘钥,因此秘钥的保密工作需要做好,只能给使用的人知道,存在问题
- 秘钥的约定时机,秘钥通过互联网传输一样会被黑客截获
非对称加密
加密和解密使用的秘钥不相同。分公钥和私钥,且公钥加密只能私钥解密,反之亦然。对称加密会存在秘钥约定十几的问题,所以需要非对称加密介入。将非对称加密的公钥公开,私钥自己保留。同样存在问题
- 服务器的回复数据,黑客可以通过公钥解密,且黑客也可以模拟发送请求,所以一对公钥私钥不够,客户端同样需要有自己的公钥和私钥,并且客户端的公钥给服务端
OkHttp
一. 曾经的网络框架
Android的网络框架有四种
- HttpClient : 2.2版本以下存在bug,所以2.3之后建议使用HttpUrlConnection
- HttpUrlConnection 2.3+, 官方推荐
- Volley,谷歌开发,简单的网络任务框架,底层兼容2.3以前版本使用了HttpClient,2.3+使用的是HttpUrlConnection,功能拓展性弱
- Okhttp,从Android4.4开始HttpURLConnection的底层实现采用的是okHttp.
优缺点

通过上面的比较,在Android发展的每个阶段,他们有各自存在的意义,只是时过境迁,被种种原因被替换或者废弃。
这个过程是一个框架发展的过程,从重量级繁杂且难以维护,到轻量级易扩展,到过度版本新老版本的兼容,最后取长补短完善自己的网络框架。
化繁为简,然后又能包容万象的过程
网络框架应该有的功能
- 自定义请求的Header
- GET,POST
- 支持文件上传下载
- 图片加载
- 支持多任务网络请求操作
- 支持缓存
- 支持回调
- 支持session
- …..
二. OkHttp简介
一张图了解OkHttp的整个过程
在OkHttp中真正核心的东西是Interceptor,他不仅负责拦截请求进行额外的处理(入cookie),实际上他还会把实际的网络请求,缓存,透明压缩等功能都统一起来,每一个功能都只是一个Interceptor,它们在连接成一个Interceptor.Chain,环环相扣最终完成一次网络请求,从getResponseWithInterceptorChain函数中我们可以看到Interceptor.Chain的分布情况依次是:
- 在配置OkHttpClinet时设置的interceptors
- 负责失败重试和重定向的RetryAndFollowUpInterceptor
- 负责把用户构造的请求转化为发送到服务器的请求,把服务器返回的响应转化为用户友好的响应BridgeInterceptor
- 负责读取缓存直接返回,更新缓存的CacheInterceptor
- 负责和服务器建立连接的ConnectInterceptor
- 配置OkHttpClient时设置的NetworkInterceptor
- 负责向服务器发送请求数据,从服务器读取响应数据的CallServerInterceptor
在这里位置决定了功能,最后一个一定是CallServerInterceptor,其他的在这之前。责任链模式在Interceptor中得到了很好的实践。对于request变成response对象,每个interceptor都能完成这件事,也由各自的inteceptor决定是否要交给下个interceptor。
三. Interceptor分析
首先看分析ConnectInterceptor和CallServerInterceptor,这两个interceptor实现了和服务器进行通信的核心
1. ConnectInterceptor建立连接
1 | /** Opens a connection to the target server and proceeds to the next interceptor. */ |
通过创建一个Exchange对象,他将在后面使用。他的内部是对http,https请求的实现,内部都是利用Okio对Socket的读写操作进行了封装.在内部是对java.io和java.nio进行了封装,内部创建了一个主要的RealConnectionn对象,利用RealConnectionn进行读写
2. CallServerInterceptor 发送和接受数据
主要过程:
- 向服务器发送request header
- 如果有request body,就向服务器发送
- 读取response header, 构造response 对象
- 如果有response body,则创建一个带body的response对象
3. CacheIntercepter 缓存
在建立连接,和服务器通讯之前就是CacheIntercepter,我们需要检查响应是否已经本地缓存了,如果缓存了则直接返回,否则进行后面的流程,并把返回的数据写入缓存
- 获取本地缓存cacheCandidate
- 如果本地缓存可用则直接返回CacheCandidate,从而打断interceptor链
- 走剩下的interceptor获取nnetworkResponse
- networkResponse、cacheResponse构造新的response
- 根据新的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 IPC
Android跨进程通讯的几种方式
Bundle
Bundle实现了Parcelable,方便在进程中传输数据。主要在activity、service、receiver中Intent中应用,
文件共享
Android基于Linux,对文件的读写没有限制。存在的问题就是并发读写的问题
sp存在缓存策略,内存中存在备份,导致多进程不可靠
使用messenger信使
- Messenger可以在不同的进程中传递Message对象,轻松实现数据的跨进程通讯。
- 它的底层实现是AIDl,内部一次只做一次处理,因此服务端不用考虑线程同步的问题
- 缺点是只能用来简单的信息传递,并发请求不大合适且无法不支持跨进程的方法的调用
