diff --git a/HelpDoc.md b/HelpDoc.md index 4733daf..7dafaa8 100644 --- a/HelpDoc.md +++ b/HelpDoc.md @@ -65,6 +65,8 @@ * [如何设置请求超时时间](#如何设置请求超时时间) * [如何设置不打印日志](#如何设置不打印日志) + + * [如何修改日志打印策略](#如何修改日志打印策略) * [如何取消已发起的请求](#如何取消已发起的请求) @@ -1130,6 +1132,24 @@ public final class XxxApi implements IRequestApi, IRequestClient { EasyConfig.getInstance().setLogEnabled(false); ``` +#### 如何修改日志打印策略 + +* 可以先定义一个类实现 [IHttpLogStrategy](library/src/main/java/com/hjq/http/config/IHttpLogStrategy.java) 接口,然后在框架初始化的时候传入即可 + +```java +EasyConfig.with(okHttpClient) + ....... + // 设置自定义的日志打印策略 + .setLogStrategy(new XxxStrategy()) + .into(); +``` + +* 需要修改日志打印策略的场景 + + * 需要将请求的日志写入到本地 + + * 需要修改打印的请求日志格式 + #### 如何取消已发起的请求 ```java diff --git a/README.md b/README.md index e8ba509..e26234c 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.5/EasyHttp.apk) +* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处下载Demo](https://github.com/getActivity/EasyHttp/releases/download/11.6/EasyHttp.apk) ![](picture/demo_code.png) @@ -61,7 +61,7 @@ android { dependencies { // 网络请求框架:https://github.com/getActivity/EasyHttp - implementation 'com.github.getActivity:EasyHttp:11.5' + implementation 'com.github.getActivity:EasyHttp:11.6' // OkHttp 框架:https://github.com/square/okhttp // noinspection GradleDependency implementation 'com.squareup.okhttp3:okhttp:3.12.13' @@ -76,9 +76,9 @@ dependencies { | 功能或细节 | [EasyHttp](https://github.com/getActivity/EasyHttp) | [Retrofit](https://github.com/square/retrofit) | [OkGo](https://github.com/jeasonlzy/okhttp-OkGo) | | :----: | :------: | :-----: | :-----: | -| 对应版本 | 11.5 | 2.9.0 | 3.0.4 | +| 对应版本 | 11.6 | 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 包大小** | 86 KB | 123 KB | 131 KB | +| **aar 包大小** | 89 KB | 123 KB | 131 KB | | minSdk 要求 | API 14+ | API 21+ | API 14+ | | 配置多域名 | ✅ | ❌ | ✅ | | **动态 Host** | ✅ | ❌ | ❌ | @@ -251,6 +251,8 @@ EasyHttp.post(this) * 省市区 Json 数据:[ProvinceJson](https://github.com/getActivity/ProvinceJson) ![](https://img.shields.io/github/stars/getActivity/ProvinceJson.svg) ![](https://img.shields.io/github/forks/getActivity/ProvinceJson.svg) +* Markdown 语法文档:[MarkdownDoc](https://github.com/getActivity/MarkdownDoc) ![](https://img.shields.io/github/stars/getActivity/MarkdownDoc.svg) ![](https://img.shields.io/github/forks/getActivity/MarkdownDoc.svg) + #### 微信公众号:Android轮子哥 ![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/official_ccount.png) diff --git a/app/build.gradle b/app/build.gradle index d6b3705..51cfaca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' -apply plugin: 'monitor-plugin' +//apply plugin: 'monitor-plugin' android { compileSdkVersion 31 @@ -14,8 +14,8 @@ android { applicationId 'com.hjq.easy.demo' minSdkVersion 21 targetSdkVersion 31 - versionCode 1150 - versionName '11.5' + versionCode 1160 + versionName '11.6' } // 支持 JDK 1.8 @@ -76,24 +76,24 @@ dependencies { implementation 'com.github.getActivity:ToastUtils:11.2' // 权限请求框架:https://github.com/getActivity/XXPermissions - implementation 'com.github.getActivity:XXPermissions:16.5' + implementation 'com.github.getActivity:XXPermissions:16.6' // 标题栏框架:https://github.com/getActivity/TitleBar - implementation 'com.github.getActivity:TitleBar:9.6' + implementation 'com.github.getActivity:TitleBar:10.0' // Json 解析框架:https://github.com/google/gson - implementation 'com.google.code.gson:gson:2.9.1' + implementation 'com.google.code.gson:gson:2.10.1' // Gson 解析容错:https://github.com/getActivity/GsonFactory - implementation 'com.github.getActivity:GsonFactory:6.3' + implementation 'com.github.getActivity:GsonFactory:6.5' // 腾讯 MMKV:https://github.com/Tencent/MMKV implementation 'com.tencent:mmkv-static:1.2.14' // 日志调试框架:https://github.com/getActivity/Logcat - debugImplementation 'com.github.getActivity:Logcat:11.0' + debugImplementation 'com.github.getActivity:Logcat:11.2' // OkHttp 抓包框架:https://github.com/lygttpod/AndroidMonitor - debugImplementation 'io.github.lygttpod:monitor:0.0.7' + // debugImplementation 'io.github.lygttpod:monitor:0.0.7' // 内存泄漏监测框架:https://github.com/square/leakcanary debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10' 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 a4f68f7..53011f5 100644 --- a/app/src/main/java/com/hjq/easy/demo/BaseActivity.java +++ b/app/src/main/java/com/hjq/easy/demo/BaseActivity.java @@ -36,7 +36,7 @@ public boolean isShowDialog() { public void showDialog() { if (mDialog == null) { mDialog = new ProgressDialog(this); - mDialog.setMessage(getResources().getString(R.string.http_loading)); + mDialog.setMessage(getResources().getString(R.string.dialog_loading_hint)); mDialog.setCancelable(false); mDialog.setCanceledOnTouchOutside(false); } 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 5aaf5d0..749048e 100644 --- a/app/src/main/java/com/hjq/easy/demo/MainActivity.java +++ b/app/src/main/java/com/hjq/easy/demo/MainActivity.java @@ -13,6 +13,7 @@ import android.view.View; import android.widget.ProgressBar; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; @@ -39,6 +40,7 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; import java.util.List; import okhttp3.Call; @@ -90,13 +92,11 @@ private void requestPermission() { */ @Override - public void onGranted(List permissions, boolean all) { - - } + public void onGranted(@NonNull List permissions, boolean allGranted) {} @Override - public void onDenied(List permissions, boolean never) { - if (never) { + public void onDenied(@NonNull List permissions, boolean doNotAskAgain) { + if (doNotAskAgain) { ToastUtils.show("授权失败,请手动授予存储权限"); XXPermissions.startPermissionActivity(this, permissions); } else { @@ -109,7 +109,7 @@ public void onDenied(List permissions, boolean never) { protected void onRestart() { super.onRestart(); if (XXPermissions.isGranted(this, Permission.Group.STORAGE)) { - onGranted(null, true); + onGranted(new ArrayList<>(), true); } else { requestPermission(); } @@ -133,10 +133,10 @@ public void onSucceed(HttpData> result) { } else if (viewId == R.id.btn_main_post) { - EasyHttp.post(this) + EasyHttp.post(MainActivity.this) .api(new SearchBlogsApi() .setKeyword("搬砖不再有")) - .request(new HttpCallback>(this) { + .request(new HttpCallback>(MainActivity.this) { @Override public void onSucceed(HttpData result) { @@ -311,12 +311,11 @@ private void installApk(final Context context, final File file) { .permission(Permission.REQUEST_INSTALL_PACKAGES) .request(new OnPermissionCallback() { @Override - public void onGranted(List permissions, boolean all) { - if (!all) { + public void onGranted(@NonNull List permissions, boolean allGranted) { + if (!allGranted) { return; } - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_VIEW); + Intent intent = new Intent(Intent.ACTION_VIEW); Uri uri; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (file instanceof FileContentResolver) { @@ -324,18 +323,19 @@ public void onGranted(List permissions, boolean all) { } else { uri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file); } - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } else { uri = Uri.fromFile(file); } intent.setDataAndType(uri, "application/vnd.android.package-archive"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // 对目标应用临时授权该 Uri 读写权限 + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); context.startActivity(intent); } @Override - public void onDenied(List permissions, boolean never) {} + public void onDenied(@NonNull List permissions, boolean doNotAskAgain) {} }); } } \ 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 27ce7c3..fd91891 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 @@ -166,6 +166,9 @@ public Exception requestFail(@NonNull HttpRequest httpRequest, @NonNull Excep } if (e instanceof IOException) { + // 出现该异常的两种情况 + // 1. 调用 EasyHttp.cancel + // 2. 网络请求被中断 return new CancelException(mApplication.getString(R.string.http_request_cancel), e); } diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml index 4332824..119e759 100644 --- a/app/src/main/res/values-v23/styles.xml +++ b/app/src/main/res/values-v23/styles.xml @@ -1,3 +1,4 @@ + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 60b77ac..f302b33 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,17 +1,7 @@ + EasyHttp - 加载中… - - 请求出错,未知错误 - 登录失效,请重新登录 - 数据解析异常,请稍后 - 服务器请求超时,请稍后再试 - 请求失败,请检查网络设置 - 服务器响应异常,请稍后再试,响应码:%d,响应信息:%s - 服务器连接异常,请稍后再试 - 请求被中断,请重试 - 服务器数据返回异常,请稍后再试 - 下载失败,文件 md5 校验失败 + 加载中… \ No newline at end of file diff --git a/app/src/main/res/values/strings_http.xml b/app/src/main/res/values/strings_http.xml new file mode 100644 index 0000000..8252817 --- /dev/null +++ b/app/src/main/res/values/strings_http.xml @@ -0,0 +1,15 @@ + + + + 请求出错,未知错误 + 登录失效,请重新登录 + 数据解析异常,请稍后 + 服务器请求超时,请稍后再试 + 请求失败,请检查网络设置 + 服务器响应异常,请稍后再试,响应码:%d,响应信息:%s + 服务器连接异常,请稍后再试 + 请求被中断,请重试 + 服务器数据返回异常,请稍后再试 + 下载失败,文件 md5 校验失败 + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9f4db37..c2d4198 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,3 +1,4 @@ + diff --git a/build.gradle b/build.gradle index 4a6759a..d111a52 100644 --- a/build.gradle +++ b/build.gradle @@ -14,9 +14,9 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:4.1.2' - // OkHttp 抓包框架:https://github.com/lygttpod/AndroidMonitor - classpath 'io.github.lygttpod:monitor-plugin:0.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31" + // OkHttp 抓包框架:https://github.com/lygttpod/AndroidMonitor + // classpath 'io.github.lygttpod:monitor-plugin:0.0.1' } } diff --git a/library/build.gradle b/library/build.gradle index 0b23bc7..c472099 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -5,8 +5,8 @@ android { defaultConfig { minSdkVersion 14 - versionCode 1150 - versionName "11.5" + versionCode 1160 + versionName "11.6" } // 使用 JDK 1.8 diff --git a/library/src/main/java/com/hjq/http/EasyConfig.java b/library/src/main/java/com/hjq/http/EasyConfig.java index 3ee30c1..f085603 100644 --- a/library/src/main/java/com/hjq/http/EasyConfig.java +++ b/library/src/main/java/com/hjq/http/EasyConfig.java @@ -1,10 +1,10 @@ package com.hjq.http; -import com.hjq.http.config.ILogStrategy; +import com.hjq.http.config.DefaultHttpLogStrategy; +import com.hjq.http.config.IHttpLogStrategy; import com.hjq.http.config.IRequestHandler; import com.hjq.http.config.IRequestInterceptor; import com.hjq.http.config.IRequestServer; -import com.hjq.http.config.LogStrategy; import com.hjq.http.config.RequestServer; import com.hjq.http.model.ThreadSchedulers; @@ -48,7 +48,7 @@ public static EasyConfig with(OkHttpClient client) { /** 请求拦截器 */ private IRequestInterceptor mInterceptor; /** 日志打印策略 */ - private ILogStrategy mLogStrategy; + private IHttpLogStrategy mLogStrategy; /** OkHttp 客户端 */ private OkHttpClient mClient; @@ -157,7 +157,7 @@ public EasyConfig setThreadSchedulers(ThreadSchedulers schedulers) { return this; } - public EasyConfig setLogStrategy(ILogStrategy strategy) { + public EasyConfig setLogStrategy(IHttpLogStrategy strategy) { mLogStrategy = strategy; return this; } @@ -218,7 +218,7 @@ public ThreadSchedulers getThreadSchedulers() { return mThreadSchedulers; } - public ILogStrategy getLogStrategy() { + public IHttpLogStrategy getLogStrategy() { return mLogStrategy; } @@ -260,7 +260,7 @@ public void into() { } if (mLogStrategy == null) { - mLogStrategy = new LogStrategy(); + mLogStrategy = new DefaultHttpLogStrategy(); } EasyConfig.setInstance(this); } diff --git a/library/src/main/java/com/hjq/http/EasyLog.java b/library/src/main/java/com/hjq/http/EasyLog.java index 3b00848..996cf16 100644 --- a/library/src/main/java/com/hjq/http/EasyLog.java +++ b/library/src/main/java/com/hjq/http/EasyLog.java @@ -86,7 +86,6 @@ private static String getLogTag(HttpRequest httpRequest) { if (httpRequest == null) { return logTag; } - return logTag + " " + httpRequest.getRequestApi().getClass().getSimpleName() + - "@" + Integer.toHexString(httpRequest.hashCode()); + return logTag + " " + httpRequest.generateLogTag(); } } \ No newline at end of file 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 71f7c45..b8972a6 100644 --- a/library/src/main/java/com/hjq/http/callback/DownloadCallback.java +++ b/library/src/main/java/com/hjq/http/callback/DownloadCallback.java @@ -183,13 +183,14 @@ private void callOnProgress() { mListener.onByte(mFile, mTotalByte, mDownloadByte); int progress = EasyUtils.getProgressProgress(mTotalByte, mDownloadByte); // 只有下载进度发生改变的时候才回调此方法,避免引起不必要的 View 重绘 - if (progress != mDownloadProgress) { - mDownloadProgress = progress; - mListener.onProgress(mFile, mDownloadProgress); - EasyLog.printLog(mHttpRequest, mFile.getPath() + - ", downloaded: " + mDownloadByte + " / " + mTotalByte + - ", progress: " + progress + " %"); + if (progress == mDownloadProgress) { + return; } + mDownloadProgress = progress; + mListener.onProgress(mFile, mDownloadProgress); + EasyLog.printLog(mHttpRequest, mFile.getPath() + + ", downloaded: " + mDownloadByte + " / " + mTotalByte + + ", progress: " + progress + " %"); } private void callOnComplete(boolean cache) { diff --git a/library/src/main/java/com/hjq/http/config/LogStrategy.java b/library/src/main/java/com/hjq/http/config/DefaultHttpLogStrategy.java similarity index 96% rename from library/src/main/java/com/hjq/http/config/LogStrategy.java rename to library/src/main/java/com/hjq/http/config/DefaultHttpLogStrategy.java index a2bfee3..405ce19 100644 --- a/library/src/main/java/com/hjq/http/config/LogStrategy.java +++ b/library/src/main/java/com/hjq/http/config/DefaultHttpLogStrategy.java @@ -11,7 +11,7 @@ * time : 2020/04/24 * desc : 网络请求日志打印默认实现 */ -public final class LogStrategy implements ILogStrategy { +public final class DefaultHttpLogStrategy implements IHttpLogStrategy { @Override public void printLog(String tag, String log) { diff --git a/library/src/main/java/com/hjq/http/config/ILogStrategy.java b/library/src/main/java/com/hjq/http/config/IHttpLogStrategy.java similarity index 95% rename from library/src/main/java/com/hjq/http/config/ILogStrategy.java rename to library/src/main/java/com/hjq/http/config/IHttpLogStrategy.java index a20f5e9..1052777 100644 --- a/library/src/main/java/com/hjq/http/config/ILogStrategy.java +++ b/library/src/main/java/com/hjq/http/config/IHttpLogStrategy.java @@ -6,7 +6,7 @@ * time : 2020/04/24 * desc : 日志打印策略 */ -public interface ILogStrategy { +public interface IHttpLogStrategy { /** * 打印分割线 diff --git a/library/src/main/java/com/hjq/http/request/DownloadRequest.java b/library/src/main/java/com/hjq/http/request/DownloadRequest.java index fa236d8..7a5892c 100644 --- a/library/src/main/java/com/hjq/http/request/DownloadRequest.java +++ b/library/src/main/java/com/hjq/http/request/DownloadRequest.java @@ -191,15 +191,22 @@ public String getRequestMethod() { @Override protected Request createRequest(String url, String tag, HttpParams params, HttpHeaders headers, BodyType bodyType) { + // 这里设置 api 的目的是为了打日志的时候不崩溃,因为现在打日志需要 api 对象 return mRealRequest.api(getRequestApi()).createRequest(url, tag, params, headers, bodyType); } @Override - protected void addHttpParams(HttpParams params, String key, Object value, BodyType type) {} + protected void addHttpParams(HttpParams params, String key, Object value, BodyType type) { + mRealRequest.addHttpParams(params, key, value, type); + } @Override - protected void addRequestParams(Request.Builder requestBuilder, HttpParams params, @Nullable String contentType, BodyType type) {} + protected void addRequestParams(Request.Builder requestBuilder, HttpParams params, @Nullable String contentType, BodyType type) { + mRealRequest.addRequestParams(requestBuilder, params, contentType, type); + } @Override - protected void printRequestLog(Request request, HttpParams params, HttpHeaders headers, BodyType type) {} + protected void printRequestLog(Request request, HttpParams params, HttpHeaders headers, BodyType type) { + mRealRequest.printRequestLog(request, params, headers, type); + } } \ No newline at end of file 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 db15270..26d61de 100644 --- a/library/src/main/java/com/hjq/http/request/HttpRequest.java +++ b/library/src/main/java/com/hjq/http/request/HttpRequest.java @@ -128,9 +128,9 @@ public T api(IRequestApi api) { return (T) this; } - public T server(Class api) { + public T server(Class server) { try { - return server(api.newInstance()); + return server(server.newInstance()); } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { @@ -625,4 +625,15 @@ protected void addRequestHeader(Request.Builder requestBuilder, HttpHeaders head * 打印请求日志 */ protected abstract void printRequestLog(Request request, HttpParams params, HttpHeaders headers, BodyType type); + + /** + * 生成日志的 TAG + */ + public String generateLogTag() { + if (mRequestApi == null) { + return ""; + } + return mRequestApi.getClass().getSimpleName() + + "@" + Integer.toHexString(mRequestApi.hashCode()); + } } \ No newline at end of file