Skip to content

Commit b0ee16c

Browse files
committed
add simpleNet readme.md
1 parent 0c30d7d commit b0ee16c

File tree

8 files changed

+60
-54
lines changed

8 files changed

+60
-54
lines changed

network/.DS_Store

0 Bytes
Binary file not shown.

network/SimpleNet/.DS_Store

6 KB
Binary file not shown.

network/SimpleNet/README.md

Lines changed: 60 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,64 @@
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+
![arch](http://img.blog.csdn.net/20150115142804901?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmJveWZlaXl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
13+
14+
SimpleNet框架的基本结构类似于Volley,包括一些命名上也有跟Volley一致。它主要分为四个部分,最上面的部分为Request,即各种请求类型。例如返回的数据类型为json的对应为JsonRequest,返回数据字符串的为StringRequest,如果需要上传文件,那么你需要使用MultipartRequest,该请求只支持小文件的上传,如果上传的文件过大则会产生OOM。
15+
16+
第二部分为消息队列,消息队列维护了提交给网络框架的请求列表,并且根据相应的规则进行排序。默认情况下更具优先级和进入队列的顺序来执行,该队列使用的是线程安全的PriorityBlockingQueue<E>,因为我们的队列会被并发的访问,因此需要保证访问的原子性。
3917

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+
![flow](images/simple_net_flow.jpg)
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的工程结构,如图所示。
4050

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+
| ![package](images/package.jpeg) | ![package](images/package-2.png) |
52+
|--------|------|
53+
|||
54+
55+
这就是SimpleNet框架的基本结构了,如果期待下一篇博客的更新,就请顶个帖吧!谢谢~
56+
57+
### 4.2 类关系图
58+
![uml](images/uml.jpg)
5459

55-
```java
56-
queue.stop();
57-
```
60+
61+
##5. 杂谈
62+
该项目模仿Volley简单实现了一个网络请求框架,该库没有经过严格的测试,适合用于学习,不建议运用到项目中。当然你要是觉得没有什么问题,也可以在你的项目中使用。
63+
本篇文章,我们对SimpleNet做了一个简介,在后续的文章中我们再进行详细介绍,敬请期待。[SimpleNetd的Request、Response类与请求队列]()[SimleNet的Http请求分发与执行]()[SimpleNet的请求配置与Response缓存]()
5864

network/SimpleNet/images/.DS_Store

6 KB
Binary file not shown.
124 KB
Loading

network/SimpleNet/images/package.jpeg

72.7 KB
Loading
76.6 KB
Loading

network/SimpleNet/images/uml.jpg

53.2 KB
Loading

0 commit comments

Comments
 (0)