|
8 | 8 |
|
9 | 9 | #### Gradle 集成
|
10 | 10 |
|
11 |
| - android { |
12 |
| - // 支持 JDK 1.8 |
13 |
| - compileOptions { |
14 |
| - targetCompatibility JavaVersion.VERSION_1_8 |
15 |
| - sourceCompatibility JavaVersion.VERSION_1_8 |
16 |
| - } |
17 |
| - } |
18 |
| - |
19 |
| - dependencies { |
20 |
| - implementation 'com.hjq:http:8.2' |
21 |
| - implementation 'com.squareup.okhttp3:okhttp:3.12.10' |
22 |
| - implementation 'com.google.code.gson:gson:2.8.5' |
| 11 | +```groovy |
| 12 | +android { |
| 13 | + // 支持 JDK 1.8 |
| 14 | + compileOptions { |
| 15 | + targetCompatibility JavaVersion.VERSION_1_8 |
| 16 | + sourceCompatibility JavaVersion.VERSION_1_8 |
23 | 17 | }
|
| 18 | +} |
| 19 | +
|
| 20 | +dependencies { |
| 21 | + implementation 'com.hjq:http:8.6' |
| 22 | + implementation 'com.squareup.okhttp3:okhttp:3.12.12' |
| 23 | + implementation 'com.google.code.gson:gson:2.8.5' |
| 24 | +} |
| 25 | +``` |
| 26 | + |
| 27 | +#### 具体用法[请点击这里查看](HelpDoc.md) |
| 28 | + |
| 29 | +#### 不同网络请求框架之间的对比 |
24 | 30 |
|
25 |
| -#### 配置权限 |
26 |
| - |
27 |
| - <!-- 联网权限 --> |
28 |
| - <uses-permission android:name="android.permission.INTERNET" /> |
29 |
| - |
30 |
| - <!-- 访问网络状态 --> |
31 |
| - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> |
32 |
| - <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> |
33 |
| - |
34 |
| -#### 服务器配置 |
35 |
| - |
36 |
| - public class RequestServer implements IRequestServer { |
37 |
| - |
38 |
| - @Override |
39 |
| - public String getHost() { |
40 |
| - return "https://www.baidu.com/"; |
41 |
| - } |
42 |
| - |
43 |
| - @Override |
44 |
| - public String getPath() { |
45 |
| - return "api/"; |
46 |
| - } |
47 |
| - |
48 |
| - @Override |
49 |
| - public BodyType getType() { |
50 |
| - // 参数以 Json 格式提交(默认是表单) |
51 |
| - return BodyType.JSON; |
52 |
| - } |
53 |
| - } |
54 |
| - |
55 |
| -#### 初始化 |
56 |
| - |
57 |
| -> 需要配置请求结果处理,具体封装可以参考 [RequestHandler](https://github.com/getActivity/EasyHttp/blob/master/app/src/main/java/com/hjq/http/demo/http/model/RequestHandler.java) |
58 |
| -
|
59 |
| - EasyConfig.with(new OkHttpClient()) |
60 |
| - // 是否打印日志 |
61 |
| - .setLogEnabled(BuildConfig.DEBUG) |
62 |
| - // 设置服务器配置 |
63 |
| - .setServer(server) |
64 |
| - // 设置请求处理策略 |
65 |
| - .setHandler(new RequestHandler()) |
66 |
| - // 设置请求重试次数 |
67 |
| - .setRetryCount(3) |
68 |
| - // 添加全局请求参数 |
69 |
| - //.addParam("token", "6666666") |
70 |
| - // 添加全局请求头 |
71 |
| - //.addHeader("time", "20191030") |
72 |
| - // 启用配置 |
73 |
| - .into(); |
74 |
| - |
75 |
| -> 上述是创建配置,更新配置可以使用 |
76 |
| -
|
77 |
| - EasyConfig.getInstance() |
78 |
| - .addParam("token", data.getData().getToken()); |
79 |
| - |
80 |
| -#### 配置接口 |
81 |
| - |
82 |
| - public final class LoginApi implements IRequestApi { |
83 |
| - |
84 |
| - @Override |
85 |
| - public String getApi() { |
86 |
| - return "user/login"; |
87 |
| - } |
88 |
| - |
89 |
| - /** 用户名 */ |
90 |
| - private String userName; |
91 |
| - |
92 |
| - /** 登录密码 */ |
93 |
| - private String password; |
94 |
| - |
95 |
| - public LoginApi setUserName(String userName) { |
96 |
| - this.userName = userName; |
97 |
| - return this; |
98 |
| - } |
99 |
| - |
100 |
| - public LoginApi setPassword(String password) { |
101 |
| - this.password = password; |
102 |
| - return this; |
103 |
| - } |
104 |
| - } |
105 |
| - |
106 |
| -* 可为这个类的字段加上一些注解 |
107 |
| - |
108 |
| - * @HttpHeader:标记这个字段是一个请求头参数 |
109 |
| - |
110 |
| - * @HttpIgnore:标记这个字段不会被发送给后台 |
111 |
| - |
112 |
| - * @HttpRename:重新定义这个字段发送给后台的参数名称 |
113 |
| - |
114 |
| -* 可在这个类实现一些接口 |
115 |
| - |
116 |
| - * implements IRequestHost:实现这个接口之后可以重新指定这个请求的主机地址 |
117 |
| - |
118 |
| - * implements IRequestPath:实现这个接口之后可以重新指定这个请求的接口路径 |
119 |
| - |
120 |
| - * implements IRequestType:实现这个接口之后可以重新指定这个请求的提交方式 |
121 |
| - |
122 |
| -* 具体用法可以[点击这里查看](HelpDoc.md) |
123 |
| - |
124 |
| -#### 发起请求 |
125 |
| - |
126 |
| -> 需要配置请求状态及生命周期处理,具体封装可以参考 [BaseActivity](https://github.com/getActivity/EasyHttp/blob/master/app/src/main/java/com/hjq/http/demo/BaseActivity.java) |
127 |
| -
|
128 |
| - EasyHttp.post(this) |
129 |
| - .api(new LoginApi() |
130 |
| - .setUserName("Android 轮子哥") |
131 |
| - .setPassword("123456")) |
132 |
| - .request(new HttpCallback<HttpData<LoginBean>>(activity) { |
133 |
| - |
134 |
| - @Override |
135 |
| - public void onSucceed(HttpData<LoginBean> data) { |
136 |
| - ToastUtils.show("登录成功"); |
137 |
| - } |
138 |
| - }); |
139 |
| - |
140 |
| -#### 下载文件 |
141 |
| - |
142 |
| -> 下载缓存策略:在指定下载文件 md5 或者后台有返回 md5 的情况下,下载框架默认开启下载缓存模式,如果这个文件已经存在手机中,并且经过 md5 校验文件完整,框架就不会重复下载,而是直接回调下载监听。减轻服务器压力,减少用户等待时间。 |
143 |
| -
|
144 |
| - EasyHttp.download(this) |
145 |
| - .method(HttpMethod.GET) |
146 |
| - .file(new File(Environment.getExternalStorageDirectory(), "微信.apk")) |
147 |
| - .url("http://dldir1.qq.com/weixin/android/weixin708android1540.apk") |
148 |
| - .md5("2E8BDD7686474A7BC4A51ADC3667CABF") |
149 |
| - .listener(new OnDownloadListener() { |
150 |
| - |
151 |
| - @Override |
152 |
| - public void onStart(Call call) { |
153 |
| - mProgressBar.setVisibility(View.VISIBLE); |
154 |
| - ToastUtils.show("下载开始"); |
155 |
| - } |
156 |
| - |
157 |
| - @Override |
158 |
| - public void onProgress(DownloadInfo info) { |
159 |
| - mProgressBar.setProgress(info.getDownloadProgress()); |
160 |
| - } |
161 |
| - |
162 |
| - @Override |
163 |
| - public void onComplete(DownloadInfo info) { |
164 |
| - ToastUtils.show("下载完成:" + info.getFile().getPath()); |
165 |
| - installApk(MainActivity.this, info.getFile()); |
166 |
| - } |
167 |
| - |
168 |
| - @Override |
169 |
| - public void onError(DownloadInfo info, Exception e) { |
170 |
| - ToastUtils.show("下载出错:" + e.getMessage()); |
171 |
| - } |
172 |
| - |
173 |
| - @Override |
174 |
| - public void onEnd(Call call) { |
175 |
| - mProgressBar.setVisibility(View.GONE); |
176 |
| - ToastUtils.show("下载结束"); |
177 |
| - } |
178 |
| - |
179 |
| - }).start(); |
| 31 | +| 功能 | [EasyHttp](https://github.com/getActivity/EasyHttp) | [Retrofit](https://github.com/square/retrofit) | [OkGo](https://github.com/jeasonlzy/okhttp-OkGo) | |
| 32 | +| :----: | :------: | :-----: | :-----: | |
| 33 | +| 动态 Host | 支持 | 不支持 | 支持 | |
| 34 | +| 全局参数 | 支持 | 不支持 | 支持 | |
| 35 | +| 超时重试 | 支持 | 不支持 | 支持 | |
| 36 | +| 极速下载 | 支持 | 不支持 | 不支持 | |
| 37 | +| 下载校验 | 支持 | 不支持 | 不支持 | |
| 38 | +| 注解数量 | 3 个 | 25 个 | 0 个 | |
| 39 | +| 上传文件类型 | File / InputStream | RequestBody | File | |
| 40 | +| 批量上传文件 | 支持 | 不支持 | 支持 | |
| 41 | +| 上传进度监听 | 支持 | 不支持 | 支持 | |
| 42 | +| Json 参数提交 | 支持 | 支持 | 支持 | |
| 43 | +| 请求生命周期 | 自动管控 | 需要封装 | 需要封装 | |
| 44 | +| 参数传值方式 | 字段名 + 字段值 | 方法参数名 + 方法参数值 | 定义 key 和 value | |
| 45 | +| 参数灵活性 | 不强制传入 | 强制全部传入 | 不强制传入 | |
| 46 | +| 框架维护状态 | 维护中 | 维护中 | 停止维护 | |
180 | 47 |
|
181 |
| -#### 关于 Http 明文请求 |
182 |
| - |
183 |
| -> Android P 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。 |
184 |
| -如果当前应用的请求是 http 请求,而非 https ,这样就会导系统禁止当前应用进行该请求,如果 WebView 的 url 用 http 协议,同样会出现加载失败,https 不受影响 |
185 |
| - |
186 |
| -> 在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下 |
| 48 | +* Retrofit 在我看来并不是那么好用,因为很多常用的功能实现起来比较麻烦,动态 Host 要写拦截器,日志打印要写拦截器,就连最常用的添加全局参数也要写拦截器,一个拦截器意味着要写很多代码,如果写得不够严谨还有可能出现 Bug,从而影响整个 OkHttp 请求流程,我经常在想这些功能能不能都用一句代码搞定,因为我觉得这些功能是框架设计的时候应该考虑的,这便是我做这个框架的初心。 |
187 | 49 |
|
188 |
| - <?xml version="1.0" encoding="utf-8"?> |
189 |
| - <network-security-config> |
190 |
| - <base-config cleartextTrafficPermitted="true" /> |
191 |
| - </network-security-config> |
| 50 | +* 本框架采用了 OOP 思想,一个请求代表一个对象,通过类的继承和实现的特性来实现接口的动态化,几乎涵盖接口开发中所有的功能,使用起来非常简单灵活。 |
192 | 51 |
|
193 |
| -> 然后在 AndroidManifest.xml application 标签内应用上面的xml配置 |
| 52 | +* 有很多人觉得写一个接口类很麻烦,这个点确实有点麻烦,但是这块的付出是有收获的,从前期开发的效率考虑:OkGo > EasyHttp > Retrofit,但是从后期维护的效率考虑:EasyHttp > Retrofit > OkGo,之所以比较这三个框架,是因为框架的设计思想不同,但是我始终认为 EasyHttp 才是最好的设计,所以我创造了它。 |
194 | 53 |
|
195 |
| - <application |
196 |
| - android:networkSecurityConfig="@xml/network_security_config" /> |
| 54 | +* 前期开发和后期维护哪个更重要?我觉得都重要,但是如果两者之间有利益冲突,我会毫不犹豫选择后期维护,因为前期开发占据的是小头,后期的持续维护才是大头。 |
197 | 55 |
|
198 | 56 | #### 混淆规则
|
199 |
| - |
200 |
| - # OkHttp3 |
201 |
| - -keepattributes Signature |
202 |
| - -keepattributes *Annotation* |
203 |
| - -keep class okhttp3.** { *; } |
204 |
| - -keep interface okhttp3.** { *; } |
205 |
| - -dontwarn okhttp3.** |
206 |
| - -dontwarn okio.** |
207 |
| - |
208 |
| - # 不混淆这个包下的字段名 |
209 |
| - -keepclassmembernames class com.hjq.http.demo.http.** { |
210 |
| - <fields>; |
211 |
| - } |
212 |
| - |
213 |
| -#### 对比 Retrofit |
214 |
| - |
215 |
| -| 功能 | Retrofit 框架 | EasyHttp 框架 | |
216 |
| -| :----: | :------: | :-----: | |
217 |
| -| 动态 Host | 不支持 | 支持 | |
218 |
| -| 全局参数 | 不支持 | 支持 | |
219 |
| -| 动态参数 | 不支持 | 支持 | |
220 |
| -| 超时重试 | 不支持 | 支持 | |
221 |
| -| 极速下载 | 不支持 | 支持 | |
222 |
| -| 下载校验 | 不支持 | 支持 | |
223 |
| -| 注解数量 | 25 个 | 3 个 | |
224 |
| -| 上传文件 | RequestBody | File / InputStream | |
225 |
| -| 生命周期 | 需要封装 | 自动管控 | |
| 57 | + |
| 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 | +``` |
226 | 72 |
|
227 | 73 | #### 作者的其他开源项目
|
228 | 74 |
|
229 |
| -* 架构工程:[AndroidProject](https://github.com/getActivity/AndroidProject) |
| 75 | +* 安卓架构:[AndroidProject](https://github.com/getActivity/AndroidProject) |
230 | 76 |
|
231 | 77 | * 日志框架:[Logcat](https://github.com/getActivity/Logcat)
|
232 | 78 |
|
|
240 | 86 |
|
241 | 87 | * 悬浮窗框架:[XToast](https://github.com/getActivity/XToast)
|
242 | 88 |
|
243 |
| -#### 特别感谢 |
244 |
| - |
245 |
| -[张鸿洋](https://github.com/hongyangAndroid) |
246 |
| - |
247 |
| -[WanAndroid](https://www.wanandroid.com/) |
248 |
| - |
249 | 89 | #### Android技术讨论Q群:78797078
|
250 | 90 |
|
251 | 91 | #### 如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face:就太:thumbsup:了。您的支持将鼓励我继续创作:octocat:
|
|
254 | 94 |
|
255 | 95 | #### [点击查看捐赠列表](https://github.com/getActivity/Donate)
|
256 | 96 |
|
| 97 | +#### 特别感谢 |
| 98 | + |
| 99 | +[张鸿洋](https://github.com/hongyangAndroid) |
| 100 | + |
| 101 | +[WanAndroid](https://www.wanandroid.com/) |
| 102 | + |
257 | 103 | ## License
|
258 | 104 |
|
259 | 105 | ```text
|
|
0 commit comments