相关阅读:
吊炸天!74款APP完整源码!
有了这些免费无限次的API 接口,再也不愁没有服务器开发不了APP了,也可以自己开发小程序了
2016年未,腾讯,百度,华为,搜狗和滴滴Android面试题汇总
作者:SilenceDut
原文链接:
http://silencedut.com/2016/09/09/Android常用开源框架的源码解读套路/
在学习Android过程中,会使用到很多开源框架,而使用时对框架的实现方式应有一定的了解,这个过程最好的方式就是阅读源码,毕竟源码说明一切。但开源框架很多,不时会有新的出现,而且对一些通用框架来说,一般代码量非常庞大,所以正确的阅读姿势很重要。一般来说有下面几个要点:
这里主要通过常用的网络请求库OkHttp,图片加载库Picasso,事件总线库EventBus等对上面提到的几点进行解读。
常用的架构模式
下图是通过阅读一些框架源码的过程总结出来的一些通用组件(或开源库)的流程图,并对每个过程进行简要分析,并不是所有的开源框架都会严格按照这个流程图里的执行步骤,但一般都会有类似的组成部分,只是个别部分的过程有些差别,一般都可以类比到这个框架中。你可以尝试用这个框架创建自己的通用库,这也是自己实现的事件总线框架
Router
所遵循的框架。
1 2 3 4 5 6 7
|
Response = Call.execute(); Call.enqueue(new Callback() { ... });
|
1
|
Picasso.with(this).load(url).into(iv);
|
例如请求
silencedut.com
,请求包如下:
Get / HTTP/1.1
Cache-Control: max-age=0
Accept-Encoding: gzip
Connection: keep-alive
Host: silencedut.com
...
请求体为空
返回的相应体为:
类似这样
HTTP/1.1 200 OK
Date: Sat, 10 Sep 2016 21:20:55 GMT
Server: nginx
Content-Type: text/html;charset=utf-8
...
相应包体是html页面
所以对网络库来说就是获取数据流,然后根据不同的协议进行解析,如果相应包体是Json类型,需要转换成相应的类结构,需要再依赖一些Json解析库如Gson,fastJson等,实现也很简单,Retrofit和Volley里就是这么做的。
对图片库来说,对于网络加载图片,这也是最常使用的,其原理是和上面的网络请求类似,只不过将得到数据流之后需要转化成Bitmap类型.
1 2
|
InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is);
|
对本地图片同理
FileInputStream fis = new FileInputStream(url);
bitmap = BitmapFactory.decodeStream(fis);
而对于资源内的图片,直接可以加载。
再就是利用上面提到的缓存LRU算法,对数据进行缓存。避免重复的获取和解析。
对事件总线库就是对之前注册的方法进行调用处理,在
Router
中需要动态代理对象的创建过程。
Router
中添加注解为
POSTING
时,也是在当前线程完成,不需要借助线程池。
在非当前线程执行,一般是借助线程池来完成,关于线程池的细节和使用可以参考
从使用到原理学习Java线程池
。因为常用框架中会有大量的请求进行,线程池可以避免线程的重复创建,可以重复利用线程。这种情况下,需要阻塞队列来管理请求的添加与执行顺序,阻塞队列可以用JDK提供的API中的BloackingQueue,也可以自己实现和维护一个队列。对于在线程池执行的任务,从
从使用到原理学习Java线程池
可以看到,一定是个Runnable,一般是将业务逻辑任务封装成Runnable或者在Runnable处理具体的逻辑。
Callable和Future、FutureTask的使用
)来获取线程池执行的结果。
在Android中任务执行的结果一般需要传递到UI线程,而Android中与UI线程的交互过程基本上就是通过Handler了。
并发的学习与使用
.
由于Cache的管理过程,所以需要对不需要的引用及时去除,如及时取消注册释放内存,或者使用弱引用等。为了避免Cache过大导致内存溢出,也需要一些缓存算法LRU等。