Skip to content

Commit fa6588d

Browse files
committed
优化代码嵌套、代码命名、代码注释
修正 Json 提交没有指明长度的问题 修复下载文件过大会导致 UI 抖动的问题 修复下载 MD5 校验失败后同时回调成功和失败的问题
1 parent c3dc96d commit fa6588d

39 files changed

+748
-646
lines changed

EasyHttp.apk

-39.7 KB
Binary file not shown.

HelpDoc.md

Lines changed: 97 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# 目录
22

3-
> 文档大致分为三类
4-
53
* [集成文档](#集成文档)
64

75
* [使用文档](#使用文档)
@@ -23,10 +21,10 @@
2321

2422
#### 关于 Http 明文请求
2523

26-
> Android P 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。
24+
* Android P 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。
2725
如果当前应用的请求是 http 请求,而非 https ,这样就会导系统禁止当前应用进行该请求,如果 WebView 的 url 用 http 协议,同样会出现加载失败,https 不受影响
2826

29-
> 在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下
27+
* 在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下
3028

3129
```xml
3230
<?xml version="1.0" encoding="utf-8"?>
@@ -35,7 +33,7 @@
3533
</network-security-config>
3634
```
3735

38-
> 然后在 AndroidManifest.xml application 标签内应用上面的xml配置
36+
* 然后在 AndroidManifest.xml application 标签内应用上面的xml配置
3937

4038
```xml
4139
<application
@@ -67,7 +65,7 @@ public class RequestServer implements IRequestServer {
6765

6866
#### 框架初始化
6967

70-
> 需要配置请求结果处理,具体封装可以参考 [RequestHandler](app/src/main/java/com/hjq/http/demo/http/model/RequestHandler.java)
68+
* 需要配置请求结果处理,具体封装可以参考 [RequestHandler](app/src/main/java/com/hjq/http/demo/http/model/RequestHandler.java)
7169

7270
```java
7371
OkHttpClient okHttpClient = new OkHttpClient.Builder()
@@ -90,13 +88,30 @@ EasyConfig.with(okHttpClient)
9088
.into();
9189
```
9290

93-
> 上述是创建配置,更新配置可以使用
91+
* 上述是创建配置,更新配置可以使用
9492

9593
```java
9694
EasyConfig.getInstance()
9795
.addParam("token", data.getData().getToken());
9896
```
9997

98+
#### 混淆规则
99+
100+
```groovy
101+
# OkHttp3
102+
-keepattributes Signature
103+
-keepattributes *Annotation*
104+
-keep class okhttp3.** { *; }
105+
-keep interface okhttp3.** { *; }
106+
-dontwarn okhttp3.**
107+
-dontwarn okio.**
108+
109+
# 不混淆这个包下的字段名
110+
-keepclassmembernames class com.hjq.http.demo.http.** {
111+
<fields>;
112+
}
113+
```
114+
100115
# 使用文档
101116

102117
#### 配置接口
@@ -142,10 +157,18 @@ public final class LoginApi implements IRequestApi {
142157
* implements IRequestPath:实现这个接口之后可以重新指定这个请求的接口路径
143158

144159
* implements IRequestType:实现这个接口之后可以重新指定这个请求的提交方式
160+
161+
* 字段作为请求参数的衡量标准
162+
163+
* 假设某个字段的属性值为空,那么这个字段将不会作为请求参数发送给后台
164+
165+
* 假设果某个字段类型是 String,属性值是空字符串,那么这个字段就会作为请求参数,如果是空对象则不会
166+
167+
* 假设某个字段类型是 int,因为基本数据类型没有空值,所以这个字段一定会作为请求参数,但是可以换成 Integer 对象来避免,因为 Integer 的默认值是 null
145168

146169
#### 发起请求
147170

148-
> 需要配置请求状态及生命周期处理,具体封装可以参考 [BaseActivity](app/src/main/java/com/hjq/http/demo/BaseActivity.java)
171+
* 需要配置请求状态及生命周期处理,具体封装可以参考 [BaseActivity](app/src/main/java/com/hjq/http/demo/BaseActivity.java)
149172

150173
```java
151174
EasyHttp.post(this)
@@ -161,8 +184,38 @@ EasyHttp.post(this)
161184
});
162185
```
163186

187+
* 这里展示 post 用法,另外 EasyHttp 还支持 get、head、delete、put、patch 请求方式,这里不再过多演示
188+
164189
#### 上传文件
165190

191+
```java
192+
public final class UpdateImageApi implements IRequestApi, IRequestType {
193+
194+
@Override
195+
public String getApi() {
196+
return "upload/";
197+
}
198+
199+
@Override
200+
public BodyType getType() {
201+
// 上传文件需要使用表单的形式提交
202+
return BodyType.FORM;
203+
}
204+
205+
/** 本地图片 */
206+
private File image;
207+
208+
public UpdateImageApi(File image) {
209+
this.image = image;
210+
}
211+
212+
public UpdateImageApi setImage(File image) {
213+
this.image = image;
214+
return this;
215+
}
216+
}
217+
```
218+
166219
```java
167220
EasyHttp.post(this)
168221
.api(new UpdateImageApi(file))
@@ -174,7 +227,7 @@ EasyHttp.post(this)
174227
}
175228

176229
@Override
177-
public void onUpdate(long totalByte, long updateByte, int progress) {
230+
public void onProgress(int progress) {
178231
mProgressBar.setProgress(progress);
179232
}
180233

@@ -197,7 +250,7 @@ EasyHttp.post(this)
197250

198251
#### 下载文件
199252

200-
> 下载缓存策略:在指定下载文件 md5 或者后台有返回 md5 的情况下,下载框架默认开启下载缓存模式,如果这个文件已经存在手机中,并且经过 md5 校验文件完整,框架就不会重复下载,而是直接回调下载监听。减轻服务器压力,减少用户等待时间。
253+
* 下载缓存策略:在指定下载文件 md5 或者后台有返回 md5 的情况下,下载框架默认开启下载缓存模式,如果这个文件已经存在手机中,并且经过 md5 校验文件完整,框架就不会重复下载,而是直接回调下载监听。减轻服务器压力,减少用户等待时间。
201254

202255
```java
203256
EasyHttp.download(this)
@@ -214,7 +267,7 @@ EasyHttp.download(this)
214267
}
215268

216269
@Override
217-
public void onProgress(File file, long totalByte, long downloadByte, int progress) {
270+
public void onProgress(File file, int progress) {
218271
mProgressBar.setProgress(progress);
219272
}
220273

@@ -244,7 +297,7 @@ try {
244297
HttpData<SearchBean> data = EasyHttp.post(MainActivity.this)
245298
.api(new SearchBlogsApi()
246299
.setKeyword("搬砖不再有"))
247-
.execute(new DataClass<HttpData<SearchBean>>() {});
300+
.execute(new ResponseClass<HttpData<SearchBean>>() {});
248301
ToastUtils.show("请求成功,请看日志");
249302
} catch (Exception e) {
250303
e.printStackTrace();
@@ -582,7 +635,7 @@ EasyConfig.getInstance().setLogEnabled(false);
582635

583636
#### 框架指定只能传入 LifecycleOwner,我想传入其他对象怎么办?
584637

585-
* 其中 AppCompatActivity 和 AndroidX.Fragment 都是 LifecycleOwner 子类的,这个是毋庸置疑的
638+
* 其中 AndroidX.AppCompatActivity 和 AndroidX.Fragment 都是 LifecycleOwner 子类的,这个是毋庸置疑的
586639

587640
* 但是你如果传入的是 Activity 对象,并非 AppCompatActivity 对象,那么你可以这样写
588641

@@ -628,4 +681,34 @@ EasyHttp.cancel(LifecycleOwner lifecycleOwner);
628681
EasyHttp.cancel(Object tag);
629682
// 取消所有请求
630683
EasyHttp.cancel();
631-
```
684+
```
685+
686+
#### getHost、getPath、getApi 方法之间的作用和区别?
687+
688+
* Host:服务器主机的地址
689+
690+
* Path:除主机地址之外的路径
691+
692+
* Api:业务模块地址
693+
694+
* 我举个栗子:[https://www.baidu.com/api/user/getInfo](https://www.baidu.com/),那么标准的写法就是
695+
696+
```java
697+
public final class XxxApi implements IRequestServer, IRequestApi {
698+
699+
@Override
700+
public String getHost() {
701+
return "https://www.baidu.com/";
702+
}
703+
704+
@Override
705+
public String getPath() {
706+
return "api/";
707+
}
708+
709+
@Override
710+
public String getApi() {
711+
return "user/getInfo";
712+
}
713+
}
714+
```

README.md

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
1-
# 网络请求框架
1+
# 简单易用的网络框架
22

33
> 码云地址:[Gitee](https://gitee.com/getActivity/EasyHttp)
44
55
> [点击此处下载Demo](EasyHttp.apk)
66
77
![](EasyHttp.jpg)
88

9+
> 另外对 OkHttp 源码感兴趣的同学可以看下面几篇文章
10+
11+
* [OkHttp 精讲:拦截器执行原理](https://www.jianshu.com/p/e0f324fd9411)
12+
13+
* [OkHttp 精讲:RetryAndFollowUpInterceptor](https://www.jianshu.com/p/40636d32cb67)
14+
15+
* [OkHttp 精讲:BridgeInterceptor](https://www.jianshu.com/p/fab2d74de900)
16+
17+
* [OkHttp 精讲:CacheInterceptor](https://www.jianshu.com/p/44fad764c0ae)
18+
19+
* [OkHttp 精讲:ConnectInterceptor](https://www.jianshu.com/p/a3a774fdff4f)
20+
21+
* [OkHttp 精讲:CallServerInterceptor](https://www.jianshu.com/p/aa77af6251ff)
22+
923
#### Gradle 集成
1024

1125
```groovy
@@ -18,61 +32,57 @@ android {
1832
}
1933
2034
dependencies {
21-
implementation 'com.hjq:http:8.6'
35+
// 网络请求框架:https://github.com/getActivity/EasyHttp
36+
implementation 'com.hjq:http:8.8'
37+
// OkHttp 框架:https://github.com/square/okhttp
38+
// noinspection GradleDependency
2239
implementation 'com.squareup.okhttp3:okhttp:3.12.12'
23-
implementation 'com.google.code.gson:gson:2.8.5'
2440
}
2541
```
2642
27-
#### 具体用法[请点击这里查看](HelpDoc.md)
43+
## [框架的具体用法请点击这里查看](HelpDoc.md)
2844

2945
#### 不同网络请求框架之间的对比
3046

3147
| 功能 | [EasyHttp](https://github.com/getActivity/EasyHttp) | [Retrofit](https://github.com/square/retrofit) | [OkGo](https://github.com/jeasonlzy/okhttp-OkGo) |
3248
| :----: | :------: | :-----: | :-----: |
49+
| 对应版本 | 8.8 | 2.9.0 | 3.0.4 |
3350
| 动态 Host | 支持 | 不支持 | 支持 |
3451
| 全局参数 | 支持 | 不支持 | 支持 |
3552
| 超时重试 | 支持 | 不支持 | 支持 |
36-
| 极速下载 | 支持 | 不支持 | 不支持 |
3753
| 下载校验 | 支持 | 不支持 | 不支持 |
54+
| 极速下载 | 支持 | 不支持 | 不支持 |
3855
| 注解数量 | 3 个 | 25 个 | 0 个 |
39-
| 上传文件类型 | File / InputStream | RequestBody | File |
56+
| 上传文件类型 | File / InputStream / RequestBody | RequestBody | File |
4057
| 批量上传文件 | 支持 | 不支持 | 支持 |
4158
| 上传进度监听 | 支持 | 不支持 | 支持 |
42-
| Json 参数提交 | 支持 | 支持 | 支持 |
59+
| Json 参数提交 | 支持 | 不支持 | 支持 |
4360
| 请求生命周期 | 自动管控 | 需要封装 | 需要封装 |
44-
| 参数传值方式 | 字段名 + 字段值 | 方法参数名 + 方法参数值 | 定义 key 和 value |
61+
| 参数传值方式 | 字段名 + 字段值 | 方法参数名 + 方法参数值 | 定义 Key + Value |
4562
| 参数灵活性 | 不强制传入 | 强制全部传入 | 不强制传入 |
63+
| 自定义 RequestBody | 支持 | 支持 | 支持 |
64+
| minSdk 要求 | API 14+ | API 21+ | API 14+ |
65+
| class 文件数量 | 70 个 | 54 个 | 85 个 |
66+
| aar 包大小 | [55 KB](https://bintray.com/getactivity/maven/http#files/com/hjq/http) | [123 KB](https://bintray.com/bintray/jcenter/com.squareup.retrofit2%3Aretrofit#files) | [131 KB](https://bintray.com/jeasonlzy/maven/okgo#files/com/lzy/net/okgo) |
4667
| 框架维护状态 | 维护中 | 维护中 | 停止维护 |
4768

48-
* Retrofit 在我看来并不是那么好用,因为很多常用的功能实现起来比较麻烦,动态 Host 要写拦截器,日志打印要写拦截器,就连最常用的添加全局参数也要写拦截器,一个拦截器意味着要写很多代码,如果写得不够严谨还有可能出现 Bug,从而影响整个 OkHttp 请求流程,我经常在想这些功能能不能都用一句代码搞定,因为我觉得这些功能是框架设计的时候应该考虑的,这便是我做这个框架的初心。
69+
* Retrofit 在我看来并不是那么好用,因为很多常用的功能实现起来比较麻烦,动态 Host 要写拦截器,日志打印要写拦截器,就连最常用的添加全局参数也要写拦截器,一个拦截器意味着要写很多代码,如果写得不够严谨还有可能出现 Bug,从而影响整个 OkHttp 请求流程,我经常在想这些功能能不能都用一句代码搞定,因为我觉得这些功能是设计框架的时候本应该考虑的,这便是我做这个框架的初心。
4970

50-
* 本框架采用了 OOP 思想,一个请求代表一个对象,通过类的继承和实现的特性来实现接口的动态化,几乎涵盖接口开发中所有的功能,使用起来非常简单灵活。
71+
* 本框架采用了 OOP 思想,一个请求代表一个对象,通过类的继承和实现的特性来实现接口的动态化配置,几乎涵盖接口开发中所有的功能,使用起来非常简单灵活。
5172

5273
* 有很多人觉得写一个接口类很麻烦,这个点确实有点麻烦,但是这块的付出是有收获的,从前期开发的效率考虑:OkGo > EasyHttp > Retrofit,但是从后期维护的效率考虑:EasyHttp > Retrofit > OkGo,之所以比较这三个框架,是因为框架的设计思想不同,但是我始终认为 EasyHttp 才是最好的设计,所以我创造了它。
5374

54-
* 前期开发和后期维护哪个更重要?我觉得都重要,但是如果两者之间有利益冲突,我会毫不犹豫选择后期维护,因为前期开发占据的是小头,后期的持续维护才是大头。
75+
* 前期开发和后期维护哪个更重要?我觉得都重要,但是如果两者之间存在利益冲突,我会毫不犹豫地选择后期维护,因为前期开发占据的是小头,后期的持续维护才是大头。
5576

56-
#### 混淆规则
77+
#### 极速下载功能介绍
5778

58-
```groovy
59-
# OkHttp3
60-
-keepattributes Signature
61-
-keepattributes *Annotation*
62-
-keep class okhttp3.** { *; }
63-
-keep interface okhttp3.** { *; }
64-
-dontwarn okhttp3.**
65-
-dontwarn okio.**
66-
67-
# 不混淆这个包下的字段名
68-
-keepclassmembernames class com.hjq.http.demo.http.** {
69-
<fields>;
70-
}
71-
```
79+
* 其实本质上面和极速秒传的原理是差不多的,只不过一个是上传,一个是下载。而极速上传是将本地文件的 MD5 值和服务器上面的进行比对,如果服务器存在这个 MD5 值的文件,就将这份文件映射一份到这个用户的网盘上面,从而达到了极速秒传的效果。而极速下载也是同理,根据后台给的文件 MD5 值和本地文件进行对比,如果存在这个文件并且 MD5 值一致,证明这个文件和服务器上面的文件是一致的,那么就直接跳过下载,直接回调下载成功监听。
80+
81+
* 极速秒传和极速下载两者相同的共同点就是,利用缓存来达到极速的效果,只不过一者通过的是服务器的缓存,另一者使用的是本地的缓存,这两者都有一个共同的特点,就是减少服务器的压力,节省用户的等待时间。
7282

7383
#### 作者的其他开源项目
7484

75-
* 安卓架构[AndroidProject](https://github.com/getActivity/AndroidProject)
85+
* 安卓技术中台[AndroidProject](https://github.com/getActivity/AndroidProject)
7686

7787
* 日志框架:[Logcat](https://github.com/getActivity/Logcat)
7888

app/build.gradle

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ android {
1414
}
1515

1616
defaultConfig {
17-
applicationId "com.hjq.http.demo"
18-
minSdkVersion 14
17+
applicationId 'com.hjq.http.demo'
18+
minSdkVersion 16
1919
targetSdkVersion 30
20-
versionCode 86
21-
versionName "8.6"
22-
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
20+
versionCode 88
21+
versionName '8.8'
22+
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
2323
}
2424

2525
buildTypes {
@@ -49,16 +49,17 @@ dependencies {
4949
implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
5050

5151
// 标题栏:https://github.com/getActivity/TitleBar
52-
implementation 'com.hjq:titlebar:8.0'
52+
implementation 'com.hjq:titlebar:8.2'
5353
// 吐司工具类:https://github.com/getActivity/ToastUtils
5454
implementation 'com.hjq:toast:8.8'
5555
// 权限请求框架:https://github.com/getActivity/XXPermissions
56-
implementation 'com.hjq:xxpermissions:8.8'
56+
implementation 'com.hjq:xxpermissions:9.2'
5757
// Json 解析框架:https://github.com/google/gson
5858
implementation 'com.google.code.gson:gson:2.8.5'
5959
// OkHttp 框架:https://github.com/square/okhttp
6060
// 升级注意事项:https://www.jianshu.com/p/d12d0f536f55
61+
// noinspection GradleDependency
6162
implementation 'com.squareup.okhttp3:okhttp:3.12.12'
6263
// 日志调试:https://github.com/getActivity/Logcat
63-
debugImplementation 'com.hjq:logcat:8.6'
64+
debugImplementation 'com.hjq:logcat:9.0'
6465
}

0 commit comments

Comments
 (0)