diff --git a/HelpDoc.md b/HelpDoc.md index 1f5a818..fc23273 100644 --- a/HelpDoc.md +++ b/HelpDoc.md @@ -100,6 +100,8 @@ * [我想自定义 Get 请求参数中的 key 和 value 该怎么做](#我想自定义-get-请求参数中的-key-和-value-该怎么做) + * [我想在 Post 请求中定义类似 Get 请求参数该怎么做](#我想在-post-请求中定义类似-get-请求参数该怎么做) + * [搭配 RxJava](#搭配-rxjava) * [准备工作](#准备工作) @@ -298,10 +300,10 @@ EasyHttp.post(this) .api(new LoginApi() .setUserName("Android 轮子哥") .setPassword("123456")) - .request(new HttpCallback>(activity) { + .request(new HttpCallbackProxy>(activity) { @Override - public void onSucceed(HttpData data) { + public void onHttpSuccess(HttpData data) { toast("登录成功"); } }); @@ -347,27 +349,27 @@ EasyHttp.post(this) .request(new OnUpdateListener() { @Override - public void onStart(Call call) { + public void onUpdateStart(Call call) { mProgressBar.setVisibility(View.VISIBLE); } @Override - public void onProgress(int progress) { + public void onUpdateProgressChange(int progress) { mProgressBar.setProgress(progress); } @Override - public void onSucceed(Void result) { + public void onUpdateSuccess(Void result) { toast("上传成功"); } @Override - public void onFail(Exception e) { + public void onUpdateFail(Exception e) { toast("上传失败"); } @Override - public void onEnd(Call call) { + public void onUpdateEnd(Call call) { mProgressBar.setVisibility(View.GONE); } }); @@ -391,28 +393,28 @@ EasyHttp.download(this) .listener(new OnDownloadListener() { @Override - public void onStart(File file) { + public void onDownloadStart(File file) { mProgressBar.setVisibility(View.VISIBLE); } @Override - public void onProgress(File file, int progress) { + public void onDownloadProgressChange(File file, int progress) { mProgressBar.setProgress(progress); } @Override - public void onComplete(File file) { + public void onDownloadSuccess(File file) { toast("下载完成:" + file.getPath()); installApk(XxxActivity.this, file); } @Override - public void onError(File file, Exception e) { + public void onDownloadFail(File file, Exception e) { toast("下载出错:" + e.getMessage()); } @Override - public void onEnd(File file) { + public void onDownloadEnd(File file) { mProgressBar.setVisibility(View.GONE); } @@ -439,10 +441,10 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { EasyHttp.post(this) .api(new XxxApi() .setImage(outputFile)) - .request(new HttpCallback>(this) { + .request(new HttpCallbackProxy>(this) { @Override - public void onSucceed(Xxx data) { + public void onHttpSuccess(Xxx data) { } }); @@ -1168,10 +1170,10 @@ EasyHttp.post(MainActivity.this) .api(new XxxApi()) // 延迟 5 秒后请求 .delay(5000) - .request(new HttpCallback>(MainActivity.this) { + .request(new HttpCallbackProxy>(MainActivity.this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } }); @@ -1203,10 +1205,10 @@ public final class XxxApi implements IRequestApi { ```java EasyHttp.post(this) .api(new RequestUrl("https://xxxx.com/aaaa")) - .request(new HttpCallback(this) { + .request(new HttpCallbackProxy(this) { @Override - public void onSucceed(Xxx result) { + public void onHttpSuccess(Xxx result) { } }); @@ -1244,10 +1246,10 @@ public final class HttpUrls { ```java EasyHttp.post(this) .api(HttpUrls.GET_USER_INFO) - .request(new HttpCallback>(this) { + .request(new HttpCallbackProxy>(this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } }); @@ -1266,10 +1268,10 @@ EasyHttp.post(this) ```java EasyHttp.post(new ActivityLifecycle(this)) .api(new XxxApi()) - .request(new HttpCallback>(this) { + .request(new HttpCallbackProxy>(this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } }); @@ -1288,12 +1290,12 @@ EasyHttp.post(ApplicationLifecycle.getInstance()) .request(new OnHttpListener>() { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } @Override - public void onFail(Exception e) { + public void onHttpFail(Exception e) { } }); @@ -1346,12 +1348,12 @@ public class XxxViewModel extends BaseViewModel { .request(new OnHttpListener>() { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } @Override - public void onFail(Exception e) { + public void onHttpFail(Exception e) { } }); @@ -1363,23 +1365,23 @@ public class XxxViewModel extends BaseViewModel { * 首先这个加载对话框不是框架自带的,是可以修改或者取消的,主要有两种方式可供选择 -* 第一种方式:重写 HttpCallback 类回调方法 +* 第一种方式:重写 HttpCallbackProxy 类回调方法 ```java EasyHttp.post(this) .api(new XxxApi()) - .request(new HttpCallback(this) { + .request(new HttpCallbackProxy(this) { @Override - public void onStart(Call call) { + public void onHttpStart(Call call) { // 重写方法并注释父类调用 - //super.onStart(call); + //super.onHttpStart(call); } @Override - public void onEnd(Call call) { + public void onHttpEnd(Call call) { // 重写方法并注释父类调用 - //super.onEnd(call); + //super.onHttpEnd(call); } }); ``` @@ -1393,12 +1395,12 @@ EasyHttp.post(this) .request(new OnHttpListener() { @Override - public void onSucceed(Xxx result) { + public void onHttpSuccess(Xxx result) { } @Override - public void onFail(Exception e) { + public void onHttpFail(Exception e) { } }); @@ -1417,10 +1419,10 @@ String json = gson.toJson(parameter); EasyHttp.post(this) .api(new XxxApi()) .body(new JsonBody(json)) - .request(new HttpCallback>(this) { + .request(new HttpCallbackProxy>(this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } }); @@ -1452,10 +1454,10 @@ JsonBody jsonBody = new JsonBody(json) EasyHttp.post(this) .api(new XxxApi()) .body(jsonBody) - .request(new HttpCallback>(this) { + .request(new HttpCallbackProxy>(this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } }); @@ -1467,15 +1469,15 @@ EasyHttp.post(this) #### 我想修改请求回调所在的线程该怎么办 -``` +```java EasyHttp.post(this) .api(new XxxApi()) // 表示回调是在子线程中进行 .schedulers(ThreadSchedulers.IOThread) - .request(new HttpCallback>(this) { + .request(new HttpCallbackProxy>(this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } }); @@ -1489,10 +1491,10 @@ EasyHttp.post(this) EasyHttp.post(this) .api(new XxxApi()) .body(RequestBody body) - .request(new HttpCallback>(this) { + .request(new HttpCallbackProxy>(this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } }); @@ -1505,7 +1507,7 @@ EasyHttp.post(this) * 具体的写法示例如下: ```java -public final class SearchBlogsApi implements IRequestApi { +public final class XxxApi implements IRequestApi { @NonNull @Override @@ -1586,10 +1588,10 @@ api.putParameter("key2", "value2"); EasyHttp.get(this) .api(api) - .request(new HttpCallback(this) { + .request(new HttpCallbackProxy(this) { @Override - public void onSucceed(Xxx result) { + public void onHttpSuccess(Xxx result) { } }); @@ -1597,6 +1599,31 @@ EasyHttp.get(this) * 需要注意的是:这种实现方式仅适用于在框架设计无法满足需求的情况下,其他情况下作者并不提倡用这种方式,因为这样不方便管理请求参数的 key,还是推荐大家使用在类上面定义字段的方式来实现。 +#### 我想在 Post 请求中定义类似 Get 请求参数该怎么做 + +* 直接拼接请求的参数到 url 上面,并且忽略某个字段的值(避免被解析成 Post 参数) + +```java +public final class XxxApi implements IRequestApi { + + @NonNull + @Override + public String getApi() { + return "article/query?pageNumber=" + pageNumber; + } + + @HttpIgnore + private int pageNumber; + + public XxxApi setPageNumber(int pageNumber) { + this.pageNumber = pageNumber; + return this; + } +} +``` + +* Ps:一般情况下我是不建议这样写的,这样的请求看起来不伦不类,即长得像一个 Get 请求,但是实际上却是一个 Post 请求。 + # 搭配 RxJava #### 准备工作 @@ -1682,10 +1709,10 @@ Observable.intervalRange(1, 3, 5000, 1000, TimeUnit.MILLISECONDS) EasyHttp.post(MainActivity.this) .api(new SearchBlogsApi() .setKeyword("搬砖不再有")) - .request(new HttpCallback>(MainActivity.this) { + .request(new HttpCallbackProxy>(MainActivity.this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } }); @@ -1703,17 +1730,17 @@ Observable.create(new ObservableOnSubscribe>() { EasyHttp.post(MainActivity.this) .api(new SearchBlogsApi() .setKeyword("搬砖不再有")) - .request(new HttpCallback>(MainActivity.this) { + .request(new HttpCallbackProxy>(MainActivity.this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { emitter.onNext(result); emitter.onComplete(); } @Override - public void onFail(Exception e) { - super.onFail(e); + public void onHttpFail(Exception e) { + super.onHttpFail(e); emitter.onError(e); } }); diff --git a/README.md b/README.md index 60fd3c8..fb0202c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ * 博客地址:[网络请求,如斯优雅](https://www.jianshu.com/p/93cd59dec002) -* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处下载Demo](https://github.com/getActivity/EasyHttp/releases/download/11.8/EasyHttp.apk) +* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处下载Demo](https://github.com/getActivity/EasyHttp/releases/download/12.0/EasyHttp.apk) ![](picture/demo_code.png) @@ -61,7 +61,7 @@ android { dependencies { // 网络请求框架:https://github.com/getActivity/EasyHttp - implementation 'com.github.getActivity:EasyHttp:11.8' + implementation 'com.github.getActivity:EasyHttp:12.0' // OkHttp 框架:https://github.com/square/okhttp // noinspection GradleDependency implementation 'com.squareup.okhttp3:okhttp:3.12.13' @@ -76,7 +76,7 @@ dependencies { | 功能或细节 | [EasyHttp](https://github.com/getActivity/EasyHttp) | [Retrofit](https://github.com/square/retrofit) | [OkGo](https://github.com/jeasonlzy/okhttp-OkGo) | | :----: | :------: | :-----: | :-----: | -| 对应版本 | 11.8 | 2.9.0 | 3.0.4 | +| 对应版本 | 12.0 | 2.9.0 | 3.0.4 | | issues 数 | [![](https://img.shields.io/github/issues/getActivity/EasyHttp.svg)](https://github.com/getActivity/EasyHttp/issues) | [![](https://img.shields.io/github/issues/square/retrofit.svg)](https://github.com/square/retrofit/issues) | [![](https://img.shields.io/github/issues/jeasonlzy/okhttp-OkGo.svg)](https://github.com/jeasonlzy/okhttp-OkGo/issues) | | **aar 包大小** | 90 KB | 123 KB | 131 KB | | minSdk 要求 | API 14+ | API 21+ | API 14+ | @@ -204,10 +204,10 @@ public final class HttpLifecycleManager implements LifecycleEventObserver { EasyHttp.post(this) .api(new XxxApi()) .delay(3000) - .request(new HttpCallback>(this) { + .request(new HttpCallbackProxy>(this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { } }); @@ -227,7 +227,7 @@ EasyHttp.post(this) * 标题栏框架:[TitleBar](https://github.com/getActivity/TitleBar) ![](https://img.shields.io/github/stars/getActivity/TitleBar.svg) ![](https://img.shields.io/github/forks/getActivity/TitleBar.svg) -* 悬浮窗框架:[XToast](https://github.com/getActivity/XToast) ![](https://img.shields.io/github/stars/getActivity/XToast.svg) ![](https://img.shields.io/github/forks/getActivity/XToast.svg) +* 悬浮窗框架:[EasyWindow](https://github.com/getActivity/EasyWindow) ![](https://img.shields.io/github/stars/getActivity/EasyWindow.svg) ![](https://img.shields.io/github/forks/getActivity/EasyWindow.svg) * Shape 框架:[ShapeView](https://github.com/getActivity/ShapeView) ![](https://img.shields.io/github/stars/getActivity/ShapeView.svg) ![](https://img.shields.io/github/forks/getActivity/ShapeView.svg) @@ -261,18 +261,28 @@ EasyHttp.post(this) #### Android 技术 Q 群:10047167 -#### 如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face:就太:thumbsup:了。您的支持将鼓励我继续创作:octocat: +#### 如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face:就太:thumbsup:了。您的支持将鼓励我继续创作:octocat:([点击查看捐赠列表](https://github.com/getActivity/Donate)) ![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_ali.png) ![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_wechat.png) -#### [点击查看捐赠列表](https://github.com/getActivity/Donate) - #### 特别感谢 * [张鸿洋](https://github.com/hongyangAndroid) * [WanAndroid](https://www.wanandroid.com/) +#### 广告区 + +* 我现在任腾讯云服务器推广大使,大家如果有购买服务器的需求,可以通过下面的链接购买 + +[![](https://upload-dianshi-1255598498.file.myqcloud.com/upload/nodir/345X200-9ae456f58874df499adf7c331c02cb0fed12b81d.jpg)](https://curl.qcloud.com/A6cYskvv) + +[【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中](https://curl.qcloud.com/A6cYskvv) + +[![](https://upload-dianshi-1255598498.file.myqcloud.com/345-200-b28f7dee9552f4241ea6a543f15a9798049701d4.jpg)](https://curl.qcloud.com/up4fQsdn) + +[【腾讯云】中小企业福利专场,多款刚需产品,满足企业通用场景需求](https://curl.qcloud.com/up4fQsdn) + ## License ```text diff --git a/app/build.gradle b/app/build.gradle index 399d63b..3ec855a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId 'com.hjq.easy.demo' minSdkVersion 21 targetSdkVersion 31 - versionCode 1180 - versionName '11.8' + versionCode 1200 + versionName '12.0' } // 支持 JDK 1.8 @@ -73,13 +73,13 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp:3.12.13' // 吐司框架:https://github.com/getActivity/Toaster - implementation 'com.github.getActivity:Toaster:12.0' + implementation 'com.github.getActivity:Toaster:12.2' // 权限请求框架:https://github.com/getActivity/XXPermissions - implementation 'com.github.getActivity:XXPermissions:16.8' + implementation 'com.github.getActivity:XXPermissions:18.2' // 标题栏框架:https://github.com/getActivity/TitleBar - implementation 'com.github.getActivity:TitleBar:10.2' + implementation 'com.github.getActivity:TitleBar:10.5' // Json 解析框架:https://github.com/google/gson implementation 'com.google.code.gson:gson:2.10.1' diff --git a/app/src/main/java/com/hjq/easy/demo/BaseActivity.java b/app/src/main/java/com/hjq/easy/demo/BaseActivity.java index 07145f2..29cd918 100644 --- a/app/src/main/java/com/hjq/easy/demo/BaseActivity.java +++ b/app/src/main/java/com/hjq/easy/demo/BaseActivity.java @@ -60,20 +60,20 @@ public void hideDialog() { } @Override - public void onStart(Call call) { + public void onHttpStart(Call call) { showDialog(); } @Override - public void onSucceed(Object result) {} + public void onHttpSuccess(Object result) {} @Override - public void onFail(Exception e) { + public void onHttpFail(Exception e) { Toaster.show(e.getMessage()); } @Override - public void onEnd(Call call) { + public void onHttpEnd(Call call) { hideDialog(); } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/easy/demo/MainActivity.java b/app/src/main/java/com/hjq/easy/demo/MainActivity.java index 6e5e1c1..4ac2048 100644 --- a/app/src/main/java/com/hjq/easy/demo/MainActivity.java +++ b/app/src/main/java/com/hjq/easy/demo/MainActivity.java @@ -26,7 +26,7 @@ import com.hjq.http.EasyHttp; import com.hjq.http.EasyUtils; import com.hjq.http.exception.FileMd5Exception; -import com.hjq.http.listener.HttpCallback; +import com.hjq.http.listener.HttpCallbackProxy; import com.hjq.http.listener.OnDownloadListener; import com.hjq.http.listener.OnUpdateListener; import com.hjq.http.model.FileContentResolver; @@ -123,10 +123,10 @@ public void onClick(View view) { EasyHttp.get(this) .api(new SearchAuthorApi() .setId(190000)) - .request(new HttpCallback>>(this) { + .request(new HttpCallbackProxy>>(this) { @Override - public void onSucceed(HttpData> result) { + public void onHttpSuccess(HttpData> result) { Toaster.show("Get 请求成功,请看日志"); } }); @@ -136,10 +136,10 @@ public void onSucceed(HttpData> result) { EasyHttp.post(MainActivity.this) .api(new SearchBlogsApi() .setKeyword("搬砖不再有")) - .request(new HttpCallback>(MainActivity.this) { + .request(new HttpCallbackProxy>(MainActivity.this) { @Override - public void onSucceed(HttpData result) { + public void onHttpSuccess(HttpData result) { Toaster.show("Post 请求成功,请看日志"); } }); @@ -207,28 +207,28 @@ public void onSucceed(HttpData result) { .request(new OnUpdateListener() { @Override - public void onStart(Call call) { + public void onUpdateStart(Call call) { mProgressBar.setProgress(0); mProgressBar.setVisibility(View.VISIBLE); } @Override - public void onProgress(int progress) { + public void onUpdateProgressChange(int progress) { mProgressBar.setProgress(progress); } @Override - public void onSucceed(Void result) { + public void onUpdateSuccess(Void result) { Toaster.show("上传成功"); } @Override - public void onFail(Exception e) { + public void onUpdateFail(Exception e) { Toaster.show("上传失败"); } @Override - public void onEnd(Call call) { + public void onUpdateEnd(Call call) { mProgressBar.setVisibility(View.GONE); } }); @@ -269,25 +269,25 @@ public void onEnd(Call call) { .listener(new OnDownloadListener() { @Override - public void onStart(File file) { + public void onDownloadStart(File file) { mProgressBar.setProgress(0); mProgressBar.setVisibility(View.VISIBLE); } @Override - public void onProgress(File file, int progress) { + public void onDownloadProgressChange(File file, int progress) { mProgressBar.setProgress(progress); } @Override - public void onComplete(File file) { - Toaster.show("下载完成:" + file.getPath()); + public void onDownloadSuccess(File file) { + Toaster.show("下载成功:" + file.getPath()); installApk(MainActivity.this, file); } @Override - public void onError(File file, Exception e) { - Toaster.show(e.getMessage()); + public void onDownloadFail(File file, Exception e) { + Toaster.show("下载失败:" + e.getMessage()); if (e instanceof FileMd5Exception) { // 如果是文件 md5 校验失败,则删除文件 file.delete(); @@ -295,7 +295,7 @@ public void onError(File file, Exception e) { } @Override - public void onEnd(File file) { + public void onDownloadEnd(File file) { mProgressBar.setVisibility(View.GONE); } }) @@ -335,7 +335,9 @@ public void onGranted(@NonNull List permissions, boolean allGranted) { } @Override - public void onDenied(@NonNull List permissions, boolean doNotAskAgain) {} + public void onDenied(@NonNull List permissions, boolean doNotAskAgain) { + Toaster.show("安装 apk 失败,请正确授予安装权限"); + } }); } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/easy/demo/http/model/HttpData.java b/app/src/main/java/com/hjq/easy/demo/http/model/HttpData.java index 1b1b418..f5ee9c6 100644 --- a/app/src/main/java/com/hjq/easy/demo/http/model/HttpData.java +++ b/app/src/main/java/com/hjq/easy/demo/http/model/HttpData.java @@ -1,5 +1,7 @@ package com.hjq.easy.demo.http.model; +import androidx.annotation.Nullable; + import okhttp3.Headers; /** @@ -10,22 +12,25 @@ */ public class HttpData { - /** 请求头 */ - private Headers headers; + /** 响应头 */ + @Nullable + private Headers responseHeaders; /** 返回码 */ private int errorCode; /** 提示语 */ private String errorMsg; /** 数据 */ + @Nullable private T data; - public void setHeaders(Headers headers) { - this.headers = headers; + public void setResponseHeaders(@Nullable Headers responseHeaders) { + this.responseHeaders = responseHeaders; } - public Headers getHeaders() { - return headers; + @Nullable + public Headers getResponseHeaders() { + return responseHeaders; } public int getCode() { @@ -36,6 +41,7 @@ public String getMessage() { return errorMsg; } + @Nullable public T getData() { return data; } @@ -44,13 +50,21 @@ public T getData() { * 是否请求成功 */ public boolean isRequestSuccess() { + // 这里为了兼容 WanAndroid 接口才这样写,但是一般情况下不建议这么设计 + // 因为 int 的默认值就是 0,这样就会导致,后台返回结果码为 0 和没有返回的效果是一样的 + // 本质上其实不一样,没有返回结果码本身就是一种错误数据结构,理论上应该走失败的回调 + // 因为这里会判断是否等于 0,所以就会导致原本走失败的回调,结果走了成功的回调 + // 所以在定义错误码协议的时候,请不要将后台返回的某个成功码或者失败码的值设计成 0 + // 如果你的项目已经出现了这种情况,可以尝试将结果码的数据类型从 int 修改成 Integer + // 这样就可以通过结果码是否等于 null 来判断后台是否返回了,当然这样也有一些弊端 + // 后面外层在使用这个结果码的时候,要先对 Integer 对象进行一次判空,否则会出现空指针异常 return errorCode == 0; } /** * 是否 Token 失效 */ - public boolean isTokenFailure() { + public boolean isTokenInvalidation() { return errorCode == 1001; } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/easy/demo/http/model/RequestHandler.java b/app/src/main/java/com/hjq/easy/demo/http/model/RequestHandler.java index aec862c..fe51de2 100644 --- a/app/src/main/java/com/hjq/easy/demo/http/model/RequestHandler.java +++ b/app/src/main/java/com/hjq/easy/demo/http/model/RequestHandler.java @@ -121,14 +121,14 @@ public Object requestSuccess(@NonNull HttpRequest httpRequest, @NonNull Respo if (result instanceof HttpData) { HttpData model = (HttpData) result; - model.setHeaders(response.headers()); + model.setResponseHeaders(response.headers()); if (model.isRequestSuccess()) { // 代表执行成功 return result; } - if (model.isTokenFailure()) { + if (model.isTokenInvalidation()) { // 代表登录失效,需要重新登录 throw new TokenException(mApplication.getString(R.string.http_token_error)); } diff --git a/library/build.gradle b/library/build.gradle index d2d6fc1..e987afe 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -4,9 +4,9 @@ android { compileSdkVersion 31 defaultConfig { - minSdkVersion 14 - versionCode 1180 - versionName "11.8" + minSdkVersion 16 + versionCode 1200 + versionName "12.0" } // 使用 JDK 1.8 diff --git a/library/src/main/java/com/hjq/http/body/ProgressBody.java b/library/src/main/java/com/hjq/http/body/ProgressBody.java index 91e3ec0..9bba426 100644 --- a/library/src/main/java/com/hjq/http/body/ProgressBody.java +++ b/library/src/main/java/com/hjq/http/body/ProgressBody.java @@ -11,7 +11,6 @@ import java.io.IOException; -import okhttp3.MediaType; import okhttp3.RequestBody; import okio.Buffer; import okio.BufferedSink; @@ -70,14 +69,14 @@ public void write(Buffer source, long byteCount) throws IOException { private void callOnProgress() { if (mListener != null && HttpLifecycleManager.isLifecycleActive(mLifecycleOwner)) { - mListener.onByte(mTotalByte, mUpdateByte); + mListener.onUpdateByteChange(mTotalByte, mUpdateByte); } int progress = EasyUtils.getProgressProgress(mTotalByte, mUpdateByte); // 只有上传进度发生改变的时候才回调此方法,避免引起不必要的 View 重绘 if (progress != mUpdateProgress) { mUpdateProgress = progress; if (mListener != null && HttpLifecycleManager.isLifecycleActive(mLifecycleOwner)) { - mListener.onProgress(progress); + mListener.onUpdateProgressChange(progress); } EasyLog.printLog(mHttpRequest, "Uploading in progress, uploaded: " + mUpdateByte + " / " + mTotalByte + diff --git a/library/src/main/java/com/hjq/http/callback/DownloadCallback.java b/library/src/main/java/com/hjq/http/callback/DownloadCallback.java index ff8e811..feea0fa 100644 --- a/library/src/main/java/com/hjq/http/callback/DownloadCallback.java +++ b/library/src/main/java/com/hjq/http/callback/DownloadCallback.java @@ -126,7 +126,7 @@ protected void onResponse(Response response) throws Exception { mMd5.equalsIgnoreCase(EasyUtils.getFileMd5(EasyUtils.openFileInputStream(mFile)))) { // 文件已存在,跳过下载 EasyLog.printLog(mHttpRequest, mFile.getPath() + " file already exists, skip download"); - EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> dispatchDownloadCompleteCallback(true)); + EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> dispatchDownloadSuccessCallback(true)); return; } @@ -150,10 +150,10 @@ protected void onResponse(Response response) throws Exception { } // 下载成功 - mHttpRequest.getRequestHandler().downloadSucceed(mHttpRequest, response, mFile); + mHttpRequest.getRequestHandler().downloadSuccess(mHttpRequest, response, mFile); EasyLog.printLog(mHttpRequest, mFile.getPath() + " download completed"); - EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> dispatchDownloadCompleteCallback(false)); + EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> dispatchDownloadSuccessCallback(false)); } @Override @@ -166,46 +166,46 @@ protected void onFailure(final Exception e) { } EasyLog.printLog(mHttpRequest, mFile.getPath() + " download error"); - EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> callDownloadError(finalException)); + EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> dispatchDownloadFailCallback(finalException)); } private void dispatchDownloadStartCallback() { if (mListener == null || !HttpLifecycleManager.isLifecycleActive(mHttpRequest.getLifecycleOwner())) { return; } - mListener.onStart(mFile); + mListener.onDownloadStart(mFile); } private void dispatchDownloadProgressCallback() { if (mListener == null || !HttpLifecycleManager.isLifecycleActive(mHttpRequest.getLifecycleOwner())) { return; } - mListener.onByte(mFile, mTotalByte, mDownloadByte); + mListener.onDownloadByteChange(mFile, mTotalByte, mDownloadByte); int progress = EasyUtils.getProgressProgress(mTotalByte, mDownloadByte); // 只有下载进度发生改变的时候才回调此方法,避免引起不必要的 View 重绘 if (progress == mDownloadProgress) { return; } mDownloadProgress = progress; - mListener.onProgress(mFile, mDownloadProgress); + mListener.onDownloadProgressChange(mFile, mDownloadProgress); EasyLog.printLog(mHttpRequest, mFile.getPath() + ", downloaded: " + mDownloadByte + " / " + mTotalByte + ", progress: " + progress + " %"); } - private void dispatchDownloadCompleteCallback(boolean cache) { + private void dispatchDownloadSuccessCallback(boolean cache) { if (mListener == null || !HttpLifecycleManager.isLifecycleActive(mHttpRequest.getLifecycleOwner())) { return; } - mListener.onComplete(mFile, cache); - mListener.onEnd(mFile); + mListener.onDownloadSuccess(mFile, cache); + mListener.onDownloadEnd(mFile); } - private void callDownloadError(Exception e) { + private void dispatchDownloadFailCallback(Exception e) { if (mListener == null || !HttpLifecycleManager.isLifecycleActive(mHttpRequest.getLifecycleOwner())) { return; } - mListener.onError(mFile, e); - mListener.onEnd(mFile); + mListener.onDownloadFail(mFile, e); + mListener.onDownloadEnd(mFile); } } \ No newline at end of file diff --git a/library/src/main/java/com/hjq/http/callback/NormalCallback.java b/library/src/main/java/com/hjq/http/callback/NormalCallback.java index b7c2d44..b681301 100644 --- a/library/src/main/java/com/hjq/http/callback/NormalCallback.java +++ b/library/src/main/java/com/hjq/http/callback/NormalCallback.java @@ -68,7 +68,7 @@ public void start() { // 读取缓存成功 EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> { onStart(getCall()); - dispatchHttpSucceedCallback(result, true); + dispatchHttpSuccessCallback(result, true); }); // 如果当前模式是先读缓存再写请求 @@ -115,15 +115,15 @@ protected void onResponse(Response response) throws Exception { cacheMode == CacheMode.USE_CACHE_FIRST || cacheMode == CacheMode.USE_CACHE_AFTER_FAILURE) { try { - boolean writeSucceed = mHttpRequest.getRequestHandler().writeCache(mHttpRequest, response, result); - EasyLog.printLog(mHttpRequest, "WriteCache result:" + writeSucceed); + boolean writeSuccess = mHttpRequest.getRequestHandler().writeCache(mHttpRequest, response, result); + EasyLog.printLog(mHttpRequest, "WriteCache result:" + writeSuccess); } catch (Exception cacheException) { EasyLog.printLog(mHttpRequest, "WriteCache error"); EasyLog.printThrowable(mHttpRequest, cacheException); } } - EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> dispatchHttpSucceedCallback(result, false)); + EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> dispatchHttpSuccessCallback(result, false)); } @Override @@ -137,7 +137,7 @@ protected void onFailure(Exception exception) { mReflectType, mHttpRequest.getRequestCache().getCacheTime()); EasyLog.printLog(mHttpRequest, "ReadCache result:" + result); if (result != null) { - EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> dispatchHttpSucceedCallback(result, true)); + EasyUtils.runOnAssignThread(mHttpRequest.getThreadSchedulers(), () -> dispatchHttpSuccessCallback(result, true)); return; } } catch (Exception cacheException) { @@ -158,23 +158,23 @@ private void dispatchHttpStartCallback() { if (mListener == null || !HttpLifecycleManager.isLifecycleActive(mHttpRequest.getLifecycleOwner())) { return; } - mListener.onStart(getCall()); + mListener.onHttpStart(getCall()); } - private void dispatchHttpSucceedCallback(Object result, boolean cache) { + private void dispatchHttpSuccessCallback(Object result, boolean cache) { if (mListener == null || !HttpLifecycleManager.isLifecycleActive(mHttpRequest.getLifecycleOwner())) { return; } - mListener.onSucceed(result, cache); - mListener.onEnd(getCall()); + mListener.onHttpSuccess(result, cache); + mListener.onHttpEnd(getCall()); } private void dispatchHttpFailCallback(Exception e) { if (mListener == null || !HttpLifecycleManager.isLifecycleActive(mHttpRequest.getLifecycleOwner())) { return; } - mListener.onFail(e); - mListener.onEnd(getCall()); + mListener.onHttpFail(e); + mListener.onHttpEnd(getCall()); } @Override diff --git a/library/src/main/java/com/hjq/http/config/IRequestHandler.java b/library/src/main/java/com/hjq/http/config/IRequestHandler.java index c11878c..4386d8b 100644 --- a/library/src/main/java/com/hjq/http/config/IRequestHandler.java +++ b/library/src/main/java/com/hjq/http/config/IRequestHandler.java @@ -57,7 +57,7 @@ default void downloadStart(@NonNull HttpRequest httpRequest, @NonNull File fi * @param response 响应对象 * @param file 下载的文件对象 */ - default void downloadSucceed(@NonNull HttpRequest httpRequest, @NonNull Response response, @NonNull File file) throws Exception {} + default void downloadSuccess(@NonNull HttpRequest httpRequest, @NonNull Response response, @NonNull File file) throws Exception {} /** * 下载失败 diff --git a/library/src/main/java/com/hjq/http/listener/HttpCallback.java b/library/src/main/java/com/hjq/http/listener/HttpCallback.java deleted file mode 100644 index b922052..0000000 --- a/library/src/main/java/com/hjq/http/listener/HttpCallback.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.hjq.http.listener; - -import okhttp3.Call; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/EasyHttp - * time : 2019/05/19 - * desc : 请求回调包装类 - */ -@SuppressWarnings({"rawtypes", "unchecked"}) -public class HttpCallback implements OnHttpListener { - - private final OnHttpListener mListener; - - public HttpCallback(OnHttpListener listener) { - mListener = listener; - } - - @Override - public void onStart(Call call) { - if (mListener == null) { - return; - } - mListener.onStart(call); - } - - @Override - public void onSucceed(T result, boolean cache) { - onSucceed(result); - } - - @Override - public void onSucceed(T result) { - if (mListener == null) { - return; - } - mListener.onSucceed(result); - } - - @Override - public void onFail(Exception e) { - if (mListener == null) { - return; - } - mListener.onFail(e); - } - - @Override - public void onEnd(Call call) { - if (mListener == null) { - return; - } - mListener.onEnd(call); - } -} \ No newline at end of file diff --git a/library/src/main/java/com/hjq/http/listener/HttpCallbackProxy.java b/library/src/main/java/com/hjq/http/listener/HttpCallbackProxy.java new file mode 100644 index 0000000..3912c55 --- /dev/null +++ b/library/src/main/java/com/hjq/http/listener/HttpCallbackProxy.java @@ -0,0 +1,64 @@ +package com.hjq.http.listener; + +import okhttp3.Call; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/EasyHttp + * time : 2019/05/19 + * desc : 请求回调代理类 + */ +@SuppressWarnings({"rawtypes", "unchecked"}) +public class HttpCallbackProxy implements OnHttpListener { + + private final OnHttpListener mSourceListener; + + public HttpCallbackProxy(OnHttpListener listener) { + mSourceListener = listener; + } + + @Override + public void onHttpStart(Call call) { + if (mSourceListener == null) { + return; + } + mSourceListener.onHttpStart(call); + } + + @Override + public void onHttpSuccess(T result, boolean cache) { + // 这里解释一下,为什么不那么写 + // 这是因为回调原有的监听器的 onHttpSuccess(T result, boolean cache) 方法, + // 最终它只会回调原有监听器的 onHttpSuccess(T result) 方法 + // 这样会导致当前类的 onHttpSuccess(T result) 方法没有被回调 + // if (mListener == null) { + // return; + // } + // mListener.onHttpSuccess(result, cache); + onHttpSuccess(result); + } + + @Override + public void onHttpSuccess(T result) { + if (mSourceListener == null) { + return; + } + mSourceListener.onHttpSuccess(result); + } + + @Override + public void onHttpFail(Exception e) { + if (mSourceListener == null) { + return; + } + mSourceListener.onHttpFail(e); + } + + @Override + public void onHttpEnd(Call call) { + if (mSourceListener == null) { + return; + } + mSourceListener.onHttpEnd(call); + } +} \ No newline at end of file diff --git a/library/src/main/java/com/hjq/http/listener/OnDownloadListener.java b/library/src/main/java/com/hjq/http/listener/OnDownloadListener.java index 3d7ba94..cfbd52b 100644 --- a/library/src/main/java/com/hjq/http/listener/OnDownloadListener.java +++ b/library/src/main/java/com/hjq/http/listener/OnDownloadListener.java @@ -13,7 +13,7 @@ public interface OnDownloadListener { /** * 下载开始 */ - void onStart(File file); + default void onDownloadStart(File file) {} /** * 下载字节改变 @@ -21,36 +21,36 @@ public interface OnDownloadListener { * @param totalByte 总字节数 * @param downloadByte 已下载字节数 */ - default void onByte(File file, long totalByte, long downloadByte) {} + default void onDownloadByteChange(File file, long totalByte, long downloadByte) {} /** * 下载进度改变 * * @param progress 下载进度值(0-100) */ - void onProgress(File file, int progress); + void onDownloadProgressChange(File file, int progress); /** - * 请求成功 + * 下载成功 * * @param cache 是否是通过缓存下载成功的 */ - default void onComplete(File file, boolean cache) { - onComplete(file); + default void onDownloadSuccess(File file, boolean cache) { + onDownloadSuccess(file); } /** - * 下载完成 + * 下载成功 */ - void onComplete(File file); + void onDownloadSuccess(File file); /** - * 下载出错 + * 下载失败 */ - void onError(File file, Exception e); + void onDownloadFail(File file, Exception e); /** * 下载结束 */ - void onEnd(File file); + default void onDownloadEnd(File file) {} } \ No newline at end of file diff --git a/library/src/main/java/com/hjq/http/listener/OnHttpListener.java b/library/src/main/java/com/hjq/http/listener/OnHttpListener.java index dccbaa7..f6854d0 100644 --- a/library/src/main/java/com/hjq/http/listener/OnHttpListener.java +++ b/library/src/main/java/com/hjq/http/listener/OnHttpListener.java @@ -13,29 +13,29 @@ public interface OnHttpListener { /** * 请求开始 */ - default void onStart(Call call) {} + default void onHttpStart(Call call) {} /** * 请求成功 * * @param cache 是否是通过缓存请求成功的 */ - default void onSucceed(T result, boolean cache) { - onSucceed(result); + default void onHttpSuccess(T result, boolean cache) { + onHttpSuccess(result); } /** * 请求成功 */ - void onSucceed(T result); + void onHttpSuccess(T result); /** * 请求出错 */ - void onFail(Exception e); + void onHttpFail(Exception e); /** * 请求结束 */ - default void onEnd(Call call) {} + default void onHttpEnd(Call call) {} } \ No newline at end of file diff --git a/library/src/main/java/com/hjq/http/listener/OnUpdateListener.java b/library/src/main/java/com/hjq/http/listener/OnUpdateListener.java index 294d088..5542905 100644 --- a/library/src/main/java/com/hjq/http/listener/OnUpdateListener.java +++ b/library/src/main/java/com/hjq/http/listener/OnUpdateListener.java @@ -1,5 +1,7 @@ package com.hjq.http.listener; +import okhttp3.Call; + /** * author : Android 轮子哥 * github : https://github.com/getActivity/EasyHttp @@ -8,18 +10,72 @@ */ public interface OnUpdateListener extends OnHttpListener { + /** + * 请求开始 + */ + @Override + default void onHttpStart(Call call) { + onUpdateStart(call); + } + + /** + * 请求成功 + */ + @Override + default void onHttpSuccess(T result) { + onUpdateSuccess(result); + } + + /** + * 请求出错 + */ + @Override + default void onHttpFail(Exception e) { + onUpdateFail(e); + } + + /** + * 请求结束 + */ + @Override + default void onHttpEnd(Call call) { + onUpdateEnd(call); + } + + /* --------------------------------------------------------------- */ + + /** + * 上传开始 + */ + default void onUpdateStart(Call call) {} + /** * 上传字节改变 * * @param totalByte 总字节数 * @param updateByte 已上传字节数 */ - default void onByte(long totalByte, long updateByte) {} + default void onUpdateByteChange(long totalByte, long updateByte) {} /** * 上传进度改变 * * @param progress 上传进度值(0-100) */ - void onProgress(int progress); + void onUpdateProgressChange(int progress); + + /** + * 上传成功 + */ + void onUpdateSuccess(T result); + + /** + * 上传出错 + */ + void onUpdateFail(Exception e); + + /** + * 上传结束 + */ + default void onUpdateEnd(Call call) {} } \ No newline at end of file diff --git a/library/src/main/java/com/hjq/http/model/FileContentResolver.java b/library/src/main/java/com/hjq/http/model/FileContentResolver.java index fd98b33..b83e7e9 100644 --- a/library/src/main/java/com/hjq/http/model/FileContentResolver.java +++ b/library/src/main/java/com/hjq/http/model/FileContentResolver.java @@ -2,6 +2,7 @@ import android.content.ContentResolver; import android.content.Context; +import android.database.Cursor; import android.net.Uri; import android.text.TextUtils; @@ -146,18 +147,14 @@ public long length() { @Override public boolean exists() { + Cursor cursor = null; try { - // 通过输入流来验证文件是否存在 - InputStream inputStream = openInputStream(); - if (inputStream != null) { - // 关闭输入流 - EasyUtils.closeStream(inputStream); - return true; - } - } catch (FileNotFoundException e) { - e.printStackTrace(); + // 通过 Cursor 来验证文件 Uri 是否存在 + cursor = mContentResolver.query(mContentUri, null, null, null, null); + return cursor != null && cursor.getCount() != 0; + } finally { + EasyUtils.closeStream(cursor); } - return false; } @Override diff --git a/library/src/main/java/com/hjq/http/request/HttpRequest.java b/library/src/main/java/com/hjq/http/request/HttpRequest.java index a93d37d..8b8f3f2 100644 --- a/library/src/main/java/com/hjq/http/request/HttpRequest.java +++ b/library/src/main/java/com/hjq/http/request/HttpRequest.java @@ -391,8 +391,8 @@ public Bean execute(ResponseClass responseClass) throws Exception { if (cacheMode == CacheMode.USE_CACHE_ONLY || cacheMode == CacheMode.USE_CACHE_AFTER_FAILURE) { try { - boolean writeSucceed = mRequestHandler.writeCache(this, response, result); - EasyLog.printLog(this, "WriteCache result:" + writeSucceed); + boolean writeSuccess = mRequestHandler.writeCache(this, response, result); + EasyLog.printLog(this, "WriteCache result:" + writeSuccess); } catch (Exception cacheException) { EasyLog.printLog(this, "WriteCache error"); EasyLog.printThrowable(this, cacheException);