Skip to content

Commit

Permalink
从 JCenter 迁移到 JitPack
Browse files Browse the repository at this point in the history
优化框架逻辑嵌套及使用文档
适配 Android 分区存储特性
修正 Delete 请求的传参方式
新增支持 Options 请求方式
新增支持 Trace 请求方式
新增支持读取父类字段作为接口参数
新增支持 MultipartBody.Part 类型做为流参数
修复 EasyUtils.beanToHashMap 出现空指针的问题
  • Loading branch information
getActivity committed May 1, 2021
1 parent b2967fa commit 355853e
Show file tree
Hide file tree
Showing 42 changed files with 1,158 additions and 720 deletions.
Binary file modified EasyHttp.apk
Binary file not shown.
55 changes: 52 additions & 3 deletions HelpDoc.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@

* [框架只能传入 LifecycleOwner 该怎么办](#框架只能传入-lifecycleowner-该怎么办)

* [我想取消请求时显示的加载对话框该怎么办](#我想取消请求时显示的加载对话框该怎么办)

* [搭配 RxJava](#搭配-rxjava)

* [准备工作](#准备工作)
Expand Down Expand Up @@ -184,8 +186,8 @@ EasyConfig.getInstance()
-dontwarn okhttp3.**
-dontwarn okio.**
# 不混淆这个包下的字段名
-keepclassmembernames class com.xxx.xxx.xxx.xxx.** {
# 不混淆这个包下的类
-keep class com.xxx.xxx.xxx.xxx.** {
<fields>;
}
```
Expand Down Expand Up @@ -358,7 +360,7 @@ EasyHttp.post(this)
});
```

* 需要注意的是:如果上传的文件过大,可能会导致请求超时,可以重新设置本次请求超时的时间,具体设置超时方式文档有介绍,可以在本页面直接搜索。
* **需要注意的是:如果上传的文件过多或者过大,可能会导致请求超时,可以重新设置本次请求超时时间,超时时间建议根据文件大小而定,具体设置超时方式文档有介绍,可以在本页面直接搜索。**

#### 下载文件

Expand Down Expand Up @@ -912,6 +914,8 @@ public interface IRequestHandler {
}
```

* 如果你想对某个接口进行加解密,可以根据方法中的 api 参数对象来判断 ,如果你想对部分接口进行加解密,可以让外层的 IRequestApi 类实现统一的接口来标识这些接口,然后在 requestStart 和 requestFail 方法中判断 api 参数对象是否实现了这个接口来决定要不要进行加解密。

#### 如何对接口路径进行动态化拼接

```java
Expand Down Expand Up @@ -1050,6 +1054,51 @@ EasyHttp.post(new ApplicationLifecycle())
EasyHttp.cancel("abc");
```

#### 我想取消请求时显示的加载对话框该怎么办

* 首先这个加载对话框不是框架自带的,是可以修改或者取消的,主要有两种方式可供选择

* 第一种方式:重写 HttpCallback 类方法

```java
EasyHttp.post(this)
.api(new XxxApi())
.request(new HttpCallback<Xxx>(this) {

@Override
public void onStart(Call call) {
// 重写方法并注释父类调用
//super.onStart(call);
}

@Override
public void onEnd(Call call) {
// 重写方法并注释父类调用
//super.onEnd(call);
}
});
```

* 第二种方式:直接实现 OnHttpListener 接口

```java

EasyHttp.post(this)
.api(new XxxApi())
.request(new OnHttpListener<Xxx>() {

@Override
public void onSucceed(Xxx result) {

}

@Override
public void onFail(Exception e) {

}
});
```

# 搭配 RxJava

#### 准备工作
Expand Down
56 changes: 42 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,23 @@

* [OkHttp 精讲:CallServerInterceptor](https://www.jianshu.com/p/aa77af6251ff)

#### Gradle 集成
#### 集成步骤

* 在项目根目录下的 `build.gradle` 文件中加入

```groovy
buildscript {
......
}
allprojects {
repositories {
// JitPack 远程仓库:https://jitpack.io
maven { url 'https://jitpack.io' }
}
}
```

* 在项目 app 模块下的 `build.gradle` 文件中加入

```groovy
android {
Expand All @@ -35,7 +51,7 @@ android {
dependencies {
// 网络请求框架:https://github.com/getActivity/EasyHttp
implementation 'com.hjq:http:9.2'
implementation 'com.github.getActivity:EasyHttp:9.5'
// OkHttp 框架:https://github.com/square/okhttp
// noinspection GradleDependency
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
Expand All @@ -46,10 +62,10 @@ dependencies {

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

| 功能或细节 | [EasyHttp](https://github.com/getActivity/EasyHttp) | [Retrofit](https://github.com/square/retrofit) + [RxJava](https://github.com/ReactiveX/RxJava) | [OkGo](https://github.com/jeasonlzy/okhttp-OkGo) |
| 功能或细节 | [EasyHttp](https://github.com/getActivity/EasyHttp) | [Retrofit](https://github.com/square/retrofit) | [OkGo](https://github.com/jeasonlzy/okhttp-OkGo) |
| :----: | :------: | :-----: | :-----: |
| 对应版本 | 9.2 | 2.9.0 | 3.0.4 |
| **aar 包大小** | [63 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) |
| 对应版本 | 9.5 | 2.9.0 | 3.0.4 |
| **aar 包大小** | [70 KB](https://jitpack.io/#getActivity/EasyHttp) | [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) |
| minSdk 要求 | API 14+ | API 21+ | API 14+ |
| 配置多域名 ||||
| **动态 Host** ||||
Expand All @@ -62,7 +78,7 @@ dependencies {
| 上传进度监听 ||||
| Json 参数提交 ||||
| **请求代码定位** ||||
| **延迟发起请求** || ||
| **延迟发起请求** || ||
| 上传文件类型 | File / InputStream / RequestBody | RequestBody | File |
| **请求生命周期** | 自动管控 | 需要封装 | 需要封装 |
| 参数传值方式 | 字段名 + 字段值 | 参数名 + 参数值 | 定义 Key + Value |
Expand All @@ -74,7 +90,17 @@ dependencies {

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

* 本框架采用了 OOP 思想,一个请求代表一个对象,通过类继承和实现的特性来对接口进行动态化配置,几乎涵盖接口开发中所有的功能,使用起来非常简单灵活。而 Retrofit 采用的是注解方式,缺点是灵活性极低,因为注解上面只能放常量,也就会限定你在注解上面的一切参数只能是事先定义好的,这对接口的动态化配置极不利的。
* OkGo 其实也存在一些弊端,例如会把参数的 key 引用放到外层去,这样会引发一些问题:

1. Key 管理问题:这个 key 可能会在外层被使用很多次,这样参数的 key 管理就会变得不可控,后续接口改动可能会出现漏改的风险,尽管这种情况比较少见,但是也不容忽视,而 EasyHttp 没有这个问题,因为 EasyHttp 不会将参数 key 值放置到外层中去。

2. 接口参数注释的问题:站在代码的规范角度上讲,我们应该在代码中注明参数的含义及作用,如果一旦将 key 放到外层,那么每一处调用的地方都需要写一遍注释,而 EasyHttp 是将参数字段化,只需要写一次注释到字段上即可。

3. 接口信息完整信息展示:使用 OkGo 请求网络,只能在调用的地方看到传递的接口参数,而一些被其他地方引用的参数,我们无法很直观的看到,只能通过追踪代码或者查看文档来得知,而 EasyHttp 将一个接口的信息全部通过一个类来管理的,这个类其实就相当于一个接口文档。

4. 接口的动态化配置:除了接口的参数之外,一个接口还有可能单独配置OkHttpClient 对象、参数的提交方式、接口响应处理方式等,这些用 OkGo 是可以实现,但是每个地方都要写一次,而 EasyHttp 可以直接在 API 类中配置,真正做到一劳永逸。

* EasyHttp 采用了 OOP 思想,一个请求代表一个对象,通过类继承和实现的特性来对接口进行动态化配置,几乎涵盖接口开发中所有的功能,使用起来非常简单灵活。而 Retrofit 采用的是注解方式,缺点是灵活性极低,因为注解上面只能放常量,也就会限定你在注解上面的一切参数只能是事先定义好的,这对接口的动态化配置极不利的。

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

Expand All @@ -100,12 +126,14 @@ public final class HttpLifecycleManager implements LifecycleEventObserver {

@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
if (event == Lifecycle.Event.ON_DESTROY) {
// 移除监听
source.getLifecycle().removeObserver(this);
// 取消请求
EasyHttp.cancel(source);
if (event != Lifecycle.Event.ON_DESTROY) {
return;
}

// 移除监听
source.getLifecycle().removeObserver(this);
// 取消请求
EasyHttp.cancel(source);
}
}
```
Expand Down Expand Up @@ -173,9 +201,9 @@ EasyHttp.post(this)

#### 特别感谢

[张鸿洋](https://github.com/hongyangAndroid)
* [张鸿洋](https://github.com/hongyangAndroid)

[WanAndroid](https://www.wanandroid.com/)
* [WanAndroid](https://www.wanandroid.com/)

## License

Expand Down
41 changes: 23 additions & 18 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,18 @@ android {
abortOnError false
}

// 支持 JDK 1.8
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}

defaultConfig {
applicationId 'com.hjq.easy.demo'
minSdkVersion 16
targetSdkVersion 30
versionCode 92
versionName '9.2'
versionCode 95
versionName '9.5'
}

// 支持 JDK 1.8
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}

buildTypes {
Expand All @@ -40,23 +40,28 @@ dependencies {

implementation project(':library')

// OkHttp 框架:https://github.com/square/okhttp
// 升级注意事项:https://www.jianshu.com/p/d12d0f536f55
// noinspection GradleDependency
implementation 'com.squareup.okhttp3:okhttp:3.12.13'

// 谷歌兼容库:https://developer.android.google.cn/jetpack/androidx/releases/appcompat?hl=zh-cn
implementation 'androidx.appcompat:appcompat:1.2.0'

// 标题栏框架:https://github.com/getActivity/TitleBar
implementation 'com.hjq:titlebar:8.5'
// 吐司框架:https://github.com/getActivity/ToastUtils
implementation 'com.hjq:toast:8.8'
implementation 'com.github.getActivity:ToastUtils:9.1'

// 权限请求框架:https://github.com/getActivity/XXPermissions
implementation 'com.hjq:xxpermissions:10.5'
implementation 'com.github.getActivity:XXPermissions:10.8'

// 标题栏框架:https://github.com/getActivity/TitleBar
implementation 'com.github.getActivity:TitleBar:8.6'

// Json 解析框架:https://github.com/google/gson
implementation 'com.google.code.gson:gson:2.8.6'
// Gson 解析容错:https://github.com/getActivity/GsonFactory
implementation 'com.hjq.gson:factory:5.2'
// OkHttp 框架:https://github.com/square/okhttp
// 升级注意事项:https://www.jianshu.com/p/d12d0f536f55
// noinspection GradleDependency
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
implementation 'com.github.getActivity:GsonFactory:5.2'

// 日志调试框架:https://github.com/getActivity/Logcat
debugImplementation 'com.hjq:logcat:9.5'
debugImplementation 'com.github.getActivity:Logcat:9.6'
}
4 changes: 2 additions & 2 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
-dontwarn okhttp3.**
-dontwarn okio.**

# 不混淆这个包下的字段名
-keepclassmembernames class com.hjq.easy.demo.http.** {
# 不混淆这个包下的类
-keep class com.hjq.easy.demo.http.** {
<fields>;
}
27 changes: 14 additions & 13 deletions app/src/main/java/com/hjq/easy/demo/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,10 @@
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;

import com.hjq.easy.demo.http.api.SearchAuthorApi;
import com.hjq.easy.demo.http.api.SearchBlogsApi;
import com.hjq.easy.demo.http.api.UpdateImageApi;
import com.hjq.easy.demo.http.model.HttpData;
import com.hjq.easy.demo.http.request.SearchAuthorApi;
import com.hjq.easy.demo.http.request.SearchBlogsApi;
import com.hjq.easy.demo.http.request.UpdateImageApi;
import com.hjq.easy.demo.http.response.SearchBean;
import com.hjq.http.EasyHttp;
import com.hjq.http.listener.HttpCallback;
import com.hjq.http.listener.OnDownloadListener;
Expand Down Expand Up @@ -107,24 +106,24 @@ public void onClick(View view) {

EasyHttp.get(this)
.api(new SearchAuthorApi()
.setAuthor("鸿洋"))
.request(new HttpCallback<HttpData<SearchBean>>(this) {
.setId(190000))
.request(new HttpCallback<HttpData<List<SearchAuthorApi.Bean>>>(this) {

@Override
public void onSucceed(HttpData<SearchBean> result) {
public void onSucceed(HttpData<List<SearchAuthorApi.Bean>> result) {
ToastUtils.show("Get 请求成功,请看日志");
}
});

} else if (viewId == R.id.btn_main_post) {

EasyHttp.post(MainActivity.this)
EasyHttp.post(this)
.api(new SearchBlogsApi()
.setKeyword("搬砖不再有"))
.request(new HttpCallback<HttpData<SearchBean>>(MainActivity.this) {
.request(new HttpCallback<HttpData<SearchBlogsApi.Bean>>(this) {

@Override
public void onSucceed(HttpData<SearchBean> result) {
public void onSucceed(HttpData<SearchBlogsApi.Bean> result) {
ToastUtils.show("Post 请求成功,请看日志");
}
});
Expand All @@ -135,10 +134,10 @@ public void onSucceed(HttpData<SearchBean> result) {
new Thread(() -> {
runOnUiThread(this::showDialog);
try {
HttpData<SearchBean> data = EasyHttp.post(MainActivity.this)
HttpData<SearchBlogsApi.Bean> data = EasyHttp.post(MainActivity.this)
.api(new SearchBlogsApi()
.setKeyword("搬砖不再有"))
.execute(new ResponseClass<HttpData<SearchBean>>() {});
.execute(new ResponseClass<HttpData<SearchBlogsApi.Bean>>() {});
ToastUtils.show("同步请求成功,请看日志");
} catch (Exception e) {
e.printStackTrace();
Expand Down Expand Up @@ -196,6 +195,7 @@ public void onEnd(Call call) {
ToastUtils.show("当前正在上传或者下载,请等待完成之后再进行操作");
return;
}

EasyHttp.download(this)
.method(HttpMethod.GET)
.file(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "微信.apk"))
Expand Down Expand Up @@ -230,7 +230,8 @@ public void onEnd(File file) {
mProgressBar.setVisibility(View.GONE);
}

}).start();
})
.start();
}
}

Expand Down
Loading

0 comments on commit 355853e

Please sign in to comment.