|
1 |
| -<img src="http://avatar.csdn.net/blogpic/20150115161936875.jpg"> |
2 |
| -# SimpleNet网络框架 |
3 |
| - SimpleNet是一个简单的Android网络框架,该框架的结构类似Volley,该框架是为了让不太熟悉框架开发或者说不太了解Android网络编程的同学学习使用。它没有经过测试,因此不太建议运用在您的项目中。当然,如果你觉得没有什么问题的话也可以直接使用在你的项目中。该框架可以以并发的形式执行网络请求,并且将结果投递给UI线程。更多介绍请参考<a href="http://blog.csdn.net/column/details/simple-net.html" target="_blank">教你写Android网络框架</a> |
4 |
| - |
5 |
| - |
6 |
| -## 使用示例 |
7 |
| -```java |
8 |
| - |
9 |
| - // 1、构建请求队列 |
10 |
| - RequestQueue queue = SimpleNet.newRequestQueue(); |
11 |
| - |
12 |
| - // 2、创建请求 |
13 |
| - MultipartRequest multipartRequest = new MultipartRequest("你的url", new RequestListener<String>() { |
14 |
| - @Override |
15 |
| - public void onComplete(int stCode, String response, String errMsg) { |
16 |
| - // 该方法执行在UI线程 |
17 |
| - } |
18 |
| - }); |
19 |
| - |
20 |
| - // 3、添加各种参数 |
21 |
| - // 添加header |
22 |
| - multipartRequest.addHeader("header-name", "value"); |
23 |
| - |
24 |
| - // 通过MultipartEntity来设置参数 |
25 |
| - MultipartEntity multi = multipartRequest.getMultiPartEntity(); |
26 |
| - // 文本参数 |
27 |
| - multi.addStringPart("location", "模拟的地理位置"); |
28 |
| - multi.addStringPart("type", "0"); |
29 |
| - |
30 |
| - Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.thumb); |
31 |
| - // 直接从上传Bitmap |
32 |
| - multi.addBinaryPart("images", bitmapToBytes(bitmap)); |
33 |
| - // 上传文件 |
34 |
| - multi.addFilePart("imgfile", new File("storage/emulated/0/test.jpg")); |
35 |
| - |
36 |
| - |
37 |
| - // 4、将请求添加到队列中 |
38 |
| - queue.addRequest(multipartRequest); |
| 1 | +SimpleNet 的设计与实现 |
| 2 | +==================================== |
| 3 | +> 本文为 [Android著名开源库的简版实现](https://github.com/simple-android-framework-exchange/simple-android-opensource-framework) 中的 SimpleNet 的设计与实现 |
| 4 | +> 原始开源库: [Volley](https://github.com/mcxiaoke/android-volley) |
| 5 | +> 作者:[Mr.Simple](https://github.com/bboyfeiyu),开发状态:完成/未完成,校对者:[Mr.Simple](https://github.com/bboyfeiyu),校对状态:未开始 |
| 6 | +
|
| 7 | + |
| 8 | +## 1. 功能介绍 |
| 9 | +SimpleNet是按照Volley的基本架构和核心原理来实现,其中省略掉了一些模块,比如CacheDispathcer等。SimpleNet能够执行网络请求,默认支持的请求类型有StringRequest、JsonRequest、MultipartRequest(可传递文件、图片参数),也可以参考上述几个类自定义请求。SimpleNet执行网络请求,并且将结果投递给UI线程。其他的一些核心概念跟Volley都非常的类型,我们在这里只是以重复造轮子的态度去学习轮子构建过程,从而达到能够造轮子的地步。 |
| 10 | + |
| 11 | +## 2. 总体设计 |
| 12 | + |
| 13 | + |
| 14 | +SimpleNet框架的基本结构类似于Volley,包括一些命名上也有跟Volley一致。它主要分为四个部分,最上面的部分为Request,即各种请求类型。例如返回的数据类型为json的对应为JsonRequest,返回数据字符串的为StringRequest,如果需要上传文件,那么你需要使用MultipartRequest,该请求只支持小文件的上传,如果上传的文件过大则会产生OOM。 |
| 15 | + |
| 16 | +第二部分为消息队列,消息队列维护了提交给网络框架的请求列表,并且根据相应的规则进行排序。默认情况下更具优先级和进入队列的顺序来执行,该队列使用的是线程安全的PriorityBlockingQueue<E>,因为我们的队列会被并发的访问,因此需要保证访问的原子性。 |
39 | 17 |
|
| 18 | +第三部分是Executor,也就是网络的执行者。该Executor继承自Thread,在run方法中循环访问第二部分的请求队列,请求完成之后将结果投递给UI线程。为了更好的控制请求队列,例如请求排序、取消等操作,这里我们并没有使用线程池来操作,而是自行管理队列和Thread的形式,这样整个结构也变得更为灵活。 |
| 19 | + |
| 20 | +第四部分则是Response投递类,在第三部分的Executor中执行网络请求,Executor是Thread,但是我们并不能在主线程中更新UI,因此我们使用ResponseDelivery来封装Response的投递,保证Response执行在UI线程。 |
| 21 | + |
| 22 | +每个部分职责都相对单一,这样便于日后的升级和维护。 |
| 23 | + |
| 24 | + |
| 25 | +## 3. 流程图 |
| 26 | + |
| 27 | + |
| 28 | + |
| 29 | +## 4. 详细设计 |
| 30 | +### 4.1 核心类详细介绍 |
| 31 | + |
| 32 | +* SimpleNet : 网络请求队列创建工厂类; |
| 33 | +* NetworkExecutor : 执行网络请求的子线程类,不断地从请求队列中读取请求,并且执行网络请求或者从缓存中获取结果,并且将结果回调给UI线程; |
| 34 | +* RequestQueue : 网络请求队列; |
| 35 | +* ResponseDelivery : 请求结果分发器,将结果投递给UI线程; |
| 36 | +* HttpStack : 执行网络请求的接口; |
| 37 | +* HttpClientStack : 使用HttpClient执行网络请求的HttpStack子类 ( api 9以下 ); |
| 38 | +* HttpUrlConnStack : 使用HttpURLConnection执行网络请求的HttpStack子类 ( api 9及其以上 ); |
| 39 | +* Request : 网络请求基类,是一个抽象的泛型类; |
| 40 | +* Response : 请求结果类,封装了请求结果的各类信息以及结果实体的字节码数据; |
| 41 | +* JsonRequest : 返回的数据类型是JsonObject的请求; |
| 42 | +* StringRequest : 返回的数据类型是字符串的请求; |
| 43 | +* MultipartRequest : 可传递文件、图片等参数的请求,返回的类型为String; |
| 44 | +* HttpConfig : http请求配置的抽象类; |
| 45 | + |
| 46 | +SimpleNet将各个子模块分布在不同的包中,并且尽量降低与其他类型的耦合,使得整个结构清晰、简单。 |
| 47 | + |
| 48 | +SimpleNet,Request是一个抽象的泛型类,泛型类型就是返回的Response类型,例如StringRequest就是继承自Request<String>。第二部分的RequestQueue依赖于Request,Request是抽象的,因此任何Request的子类都可以传递到请求队列中来,它依赖的是抽象Request,而不是具体的某个实现,因此保证了可扩展性。你可以自己实现自己所需的Request,例如大文件的上传Request。同理,第三部分的NetworkExecutor也只是依赖于Request抽象,但这里又引入了一个类型HttpStack,这个网络请求的真正执行者,有HttpClientStack和HttpUrlConnStack,两者分别为Apache的HttpClient和java的HttpURLConnection,关于这两者的区别请参考:Android访问网络,使用HttpURLConnection还是HttpClient?。HttpStack也是一个抽象,具体使用HttpClient还是HttpURLConnection则由运行系统版本来定,HttpStackFactory会根据系统版本给框架返回对应的HttpStack。最后的ResponseDelivery比较简单了,只是通过Handler将结果投递给UI线程执行,也就是执行RequestListener的onComplete方法,此时网络执行完成,用户即可在该方法中更新UI或者相关的其他的操作。 |
| 49 | + 下面我们再看看SimpleNet的工程结构,如图所示。 |
40 | 50 |
|
41 |
| - // 返回JSONObject的请求 |
42 |
| - // JsonRequest jsonRequest = new JsonRequest(HttpMethod.GET, "服务器地址", new RequestListener<JSONObject>() { |
43 |
| - // |
44 |
| - // @Override |
45 |
| - // public void onComplete(int stCode, JSONObject response, String errMsg) { |
46 |
| - // |
47 |
| - // } |
48 |
| - // |
49 |
| - // }) ; |
50 |
| - |
51 |
| -``` |
52 |
| - |
53 |
| - 最后,记得在Activity销毁时关闭消息队列。 |
| 51 | +|  |  | |
| 52 | +|--------|------| |
| 53 | +||| |
| 54 | + |
| 55 | +这就是SimpleNet框架的基本结构了,如果期待下一篇博客的更新,就请顶个帖吧!谢谢~ |
| 56 | + |
| 57 | +### 4.2 类关系图 |
| 58 | + |
54 | 59 |
|
55 |
| -```java |
56 |
| -queue.stop(); |
57 |
| -``` |
| 60 | + |
| 61 | +##5. 杂谈 |
| 62 | +该项目模仿Volley简单实现了一个网络请求框架,该库没有经过严格的测试,适合用于学习,不建议运用到项目中。当然你要是觉得没有什么问题,也可以在你的项目中使用。 |
| 63 | +本篇文章,我们对SimpleNet做了一个简介,在后续的文章中我们再进行详细介绍,敬请期待。[SimpleNetd的Request、Response类与请求队列]()、[SimleNet的Http请求分发与执行]()、[SimpleNet的请求配置与Response缓存]()。 |
58 | 64 |
|
0 commit comments