From 9dc1581730e36ce630a665f8a78dc0432cd6a7ef Mon Sep 17 00:00:00 2001 From: xuexiangjys Date: Sat, 15 Feb 2020 18:12:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E5=85=BC=E5=AE=B9flutter=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=99=A8=E6=96=B0=E5=A2=9E=E5=BC=82=E6=AD=A5=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../custom/CustomUpdateParser.java | 19 ++++++++ .../custom/XUpdateServiceParser.java | 4 +- .../com/xuexiang/xupdate/UpdateManager.java | 34 +++++++++++++ .../listener/IUpdateParseCallback.java | 20 ++++++++ .../xuexiang/xupdate/proxy/IUpdateParser.java | 22 ++++++++- .../xuexiang/xupdate/proxy/IUpdateProxy.java | 37 ++++++++++---- .../proxy/impl/AbstractUpdateParser.java | 23 +++++++++ .../proxy/impl/DefaultUpdateChecker.java | 48 ++++++++++++------- .../proxy/impl/DefaultUpdateParser.java | 5 +- 10 files changed, 184 insertions(+), 32 deletions(-) create mode 100644 xupdate-lib/src/main/java/com/xuexiang/xupdate/listener/IUpdateParseCallback.java create mode 100644 xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/AbstractUpdateParser.java diff --git a/app/build.gradle b/app/build.gradle index 11f7c79..1f1b7be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,9 +58,9 @@ dependencies { testImplementation deps.junit androidTestImplementation deps.runner androidTestImplementation deps.espresso.core -// implementation project(':xupdate-lib') + implementation project(':xupdate-lib') - implementation 'com.github.xuexiangjys:XUpdate:1.1.3' +// implementation 'com.github.xuexiangjys:XUpdate:1.1.3' implementation 'com.github.xuexiangjys.XUtil:xutil-core:1.1.6' implementation 'com.github.xuexiangjys.XUtil:xutil-sub:1.1.6' diff --git a/app/src/main/java/com/xuexiang/xupdatedemo/custom/CustomUpdateParser.java b/app/src/main/java/com/xuexiang/xupdatedemo/custom/CustomUpdateParser.java index cae0cdf..ec8081c 100644 --- a/app/src/main/java/com/xuexiang/xupdatedemo/custom/CustomUpdateParser.java +++ b/app/src/main/java/com/xuexiang/xupdatedemo/custom/CustomUpdateParser.java @@ -16,7 +16,10 @@ package com.xuexiang.xupdatedemo.custom; +import android.support.annotation.NonNull; + import com.xuexiang.xupdate.entity.UpdateEntity; +import com.xuexiang.xupdate.listener.IUpdateParseCallback; import com.xuexiang.xupdate.proxy.IUpdateParser; import com.xuexiang.xupdatedemo.entity.CustomResult; import com.xuexiang.xutil.net.JsonUtil; @@ -30,6 +33,10 @@ public class CustomUpdateParser implements IUpdateParser { @Override public UpdateEntity parseJson(String json) throws Exception { + return getParseResult(json); + } + + private UpdateEntity getParseResult(String json) { CustomResult result = JsonUtil.fromJson(json, CustomResult.class); if (result != null) { return new UpdateEntity() @@ -43,4 +50,16 @@ public UpdateEntity parseJson(String json) throws Exception { } return null; } + + @Override + public void parseJson(String json, @NonNull IUpdateParseCallback callback) throws Exception { + //当isAsyncParser为 true时调用该方法, 所以当isAsyncParser为false可以不实现 + callback.onParseResult(getParseResult(json)); + } + + + @Override + public boolean isAsyncParser() { + return false; + } } diff --git a/app/src/main/java/com/xuexiang/xupdatedemo/custom/XUpdateServiceParser.java b/app/src/main/java/com/xuexiang/xupdatedemo/custom/XUpdateServiceParser.java index a9808c5..20db633 100644 --- a/app/src/main/java/com/xuexiang/xupdatedemo/custom/XUpdateServiceParser.java +++ b/app/src/main/java/com/xuexiang/xupdatedemo/custom/XUpdateServiceParser.java @@ -19,7 +19,7 @@ import com.xuexiang.xupdate.XUpdate; import com.xuexiang.xupdate.entity.CheckVersionResult; import com.xuexiang.xupdate.entity.UpdateEntity; -import com.xuexiang.xupdate.proxy.IUpdateParser; +import com.xuexiang.xupdate.proxy.impl.AbstractUpdateParser; import com.xuexiang.xupdate.utils.UpdateUtils; import com.xuexiang.xupdatedemo.entity.ApiResult; import com.xuexiang.xupdatedemo.entity.AppVersionInfo; @@ -33,7 +33,7 @@ * @author xuexiang * @since 2018/7/30 下午12:00 */ -public class XUpdateServiceParser implements IUpdateParser { +public class XUpdateServiceParser extends AbstractUpdateParser { @Override public UpdateEntity parseJson(String json) throws Exception { ApiResult apiResult = JsonUtil.fromJson(json, getApiResultType(AppVersionInfo.class)); diff --git a/xupdate-lib/src/main/java/com/xuexiang/xupdate/UpdateManager.java b/xupdate-lib/src/main/java/com/xuexiang/xupdate/UpdateManager.java index 53a9e1d..e36942e 100644 --- a/xupdate-lib/src/main/java/com/xuexiang/xupdate/UpdateManager.java +++ b/xupdate-lib/src/main/java/com/xuexiang/xupdate/UpdateManager.java @@ -28,6 +28,7 @@ import com.xuexiang.xupdate.entity.PromptEntity; import com.xuexiang.xupdate.entity.UpdateEntity; +import com.xuexiang.xupdate.listener.IUpdateParseCallback; import com.xuexiang.xupdate.logs.UpdateLog; import com.xuexiang.xupdate.proxy.IUpdateChecker; import com.xuexiang.xupdate.proxy.IUpdateDownloader; @@ -245,6 +246,15 @@ public void onAfterCheck() { } } + @Override + public boolean isAsyncParser() { + if (mIUpdateProxy != null) { + return mIUpdateProxy.isAsyncParser(); + } else { + return mIUpdateParser.isAsyncParser(); + } + } + /** * 将请求的json结果解析为版本更新信息实体 * @@ -263,6 +273,28 @@ public UpdateEntity parseJson(@NonNull String json) throws Exception { return mUpdateEntity; } + @Override + public void parseJson(@NonNull String json, final IUpdateParseCallback callback) throws Exception { + UpdateLog.i("服务端返回的最新版本信息:" + json); + if (mIUpdateProxy != null) { + mIUpdateProxy.parseJson(json, new IUpdateParseCallback() { + @Override + public void onParseResult(UpdateEntity updateEntity) { + mUpdateEntity = refreshParams(updateEntity); + callback.onParseResult(updateEntity); + } + }); + } else { + mIUpdateParser.parseJson(json, new IUpdateParseCallback() { + @Override + public void onParseResult(UpdateEntity updateEntity) { + mUpdateEntity = refreshParams(updateEntity); + callback.onParseResult(updateEntity); + } + }); + } + } + /** * 刷新本地参数 * @@ -371,6 +403,8 @@ public void cancelDownload() { } } + + //============================构建者===============================// /** diff --git a/xupdate-lib/src/main/java/com/xuexiang/xupdate/listener/IUpdateParseCallback.java b/xupdate-lib/src/main/java/com/xuexiang/xupdate/listener/IUpdateParseCallback.java new file mode 100644 index 0000000..f56f3c2 --- /dev/null +++ b/xupdate-lib/src/main/java/com/xuexiang/xupdate/listener/IUpdateParseCallback.java @@ -0,0 +1,20 @@ +package com.xuexiang.xupdate.listener; + +import com.xuexiang.xupdate.entity.UpdateEntity; + +/** + * 异步解析的回调 + * + * @author xuexiang + * @since 2020-02-15 17:23 + */ +public interface IUpdateParseCallback { + + /** + * 解析结果 + * + * @param updateEntity + */ + void onParseResult(UpdateEntity updateEntity); + +} diff --git a/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/IUpdateParser.java b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/IUpdateParser.java index a140c3e..344ad67 100644 --- a/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/IUpdateParser.java +++ b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/IUpdateParser.java @@ -17,9 +17,10 @@ package com.xuexiang.xupdate.proxy; import com.xuexiang.xupdate.entity.UpdateEntity; +import com.xuexiang.xupdate.listener.IUpdateParseCallback; /** - * 版本更新解析器 + * 版本更新解析器[异步解析和同步解析方法只需要实现一个就行了,当isAsyncParser为true时需要实现异步解析方法,否则实现同步解析方法] * * @author xuexiang * @since 2018/6/29 下午8:30 @@ -27,10 +28,29 @@ public interface IUpdateParser { /** + * [同步解析方法] + *

* 将请求的json结果解析为版本更新信息实体 * * @param json * @return */ UpdateEntity parseJson(String json) throws Exception; + + /** + * [异步解析方法] + *

+ * 将请求的json结果解析为版本更新信息实体 + * + * @param json + * @param callback + * @return + */ + void parseJson(String json, final IUpdateParseCallback callback) throws Exception; + + /** + * @return 是否是异步解析 + */ + boolean isAsyncParser(); + } diff --git a/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/IUpdateProxy.java b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/IUpdateProxy.java index 96911d5..c3f9139 100644 --- a/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/IUpdateProxy.java +++ b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/IUpdateProxy.java @@ -21,6 +21,7 @@ import android.support.annotation.Nullable; import com.xuexiang.xupdate.entity.UpdateEntity; +import com.xuexiang.xupdate.listener.IUpdateParseCallback; import com.xuexiang.xupdate.service.OnFileDownloadListener; /** @@ -50,6 +51,8 @@ public interface IUpdateProxy { */ void update(); + //=============================// + /** * 版本检查之前 */ @@ -65,14 +68,6 @@ public interface IUpdateProxy { */ void onAfterCheck(); - /** - * 将请求的json结果解析为版本更新信息实体 - * - * @param json - * @return - */ - UpdateEntity parseJson(@NonNull String json) throws Exception; - /** * 发现新版本 * @@ -88,6 +83,32 @@ public interface IUpdateProxy { */ void noNewVersion(@NonNull Throwable throwable); + //=============================// + + /** + * @return 是否是异步解析者 + */ + boolean isAsyncParser(); + + /** + * 将请求的json结果解析为版本更新信息实体【同步方法】 + * + * @param json + * @return + */ + UpdateEntity parseJson(@NonNull String json) throws Exception; + + /** + * 将请求的json结果解析为版本更新信息实体【异步方法】 + * + * @param json + * @param callback 解析回调 + * @return + */ + void parseJson(@NonNull String json, final IUpdateParseCallback callback) throws Exception; + + //=============================// + /** * 开始下载更新 * diff --git a/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/AbstractUpdateParser.java b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/AbstractUpdateParser.java new file mode 100644 index 0000000..46ce398 --- /dev/null +++ b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/AbstractUpdateParser.java @@ -0,0 +1,23 @@ +package com.xuexiang.xupdate.proxy.impl; + +import com.xuexiang.xupdate.listener.IUpdateParseCallback; +import com.xuexiang.xupdate.proxy.IUpdateParser; + +/** + * 默认是使用同步解析器,因此异步解析方法不需要实现 + * + * @author xuexiang + * @since 2020-02-15 17:56 + */ +public abstract class AbstractUpdateParser implements IUpdateParser { + + @Override + public void parseJson(String json, IUpdateParseCallback callback) throws Exception { + //当isAsyncParser为 true时调用该方法 + } + + @Override + public boolean isAsyncParser() { + return false; + } +} diff --git a/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/DefaultUpdateChecker.java b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/DefaultUpdateChecker.java index cb02a4a..f4f3624 100644 --- a/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/DefaultUpdateChecker.java +++ b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/DefaultUpdateChecker.java @@ -21,6 +21,7 @@ import com.xuexiang.xupdate._XUpdate; import com.xuexiang.xupdate.entity.UpdateEntity; +import com.xuexiang.xupdate.listener.IUpdateParseCallback; import com.xuexiang.xupdate.proxy.IUpdateChecker; import com.xuexiang.xupdate.proxy.IUpdateHttpService; import com.xuexiang.xupdate.proxy.IUpdateProxy; @@ -117,30 +118,45 @@ private void onCheckError(@NonNull IUpdateProxy updateProxy, Throwable error) { } @Override - public void processCheckResult(@NonNull String result, @NonNull IUpdateProxy updateProxy) { + public void processCheckResult(final @NonNull String result, final @NonNull IUpdateProxy updateProxy) { try { - UpdateEntity updateEntity = updateProxy.parseJson(result); - if (updateEntity != null) { - if (updateEntity.isHasUpdate()) { - //校验是否是已忽略版本 - if (UpdateUtils.isIgnoreVersion(updateProxy.getContext(), updateEntity.getVersionName())) { - _XUpdate.onUpdateError(CHECK_IGNORED_VERSION); - //校验apk下载缓存目录是否为空 - } else if (TextUtils.isEmpty(updateEntity.getApkCacheDir())) { - _XUpdate.onUpdateError(CHECK_APK_CACHE_DIR_EMPTY); - } else { - updateProxy.findNewVersion(updateEntity, updateProxy); + if (updateProxy.isAsyncParser()) { + //异步解析 + updateProxy.parseJson(result, new IUpdateParseCallback() { + @Override + public void onParseResult(UpdateEntity updateEntity) { + processUpdateEntity(updateEntity, result, updateProxy); } - } else { - _XUpdate.onUpdateError(CHECK_NO_NEW_VERSION); - } + }); } else { - _XUpdate.onUpdateError(CHECK_PARSE, "json:" + result); + //同步解析 + processUpdateEntity(updateProxy.parseJson(result), result, updateProxy); } + } catch (Exception e) { e.printStackTrace(); _XUpdate.onUpdateError(CHECK_PARSE, e.getMessage()); } } + private void processUpdateEntity(UpdateEntity updateEntity, @NonNull String result, @NonNull IUpdateProxy updateProxy) { + if (updateEntity != null) { + if (updateEntity.isHasUpdate()) { + //校验是否是已忽略版本 + if (UpdateUtils.isIgnoreVersion(updateProxy.getContext(), updateEntity.getVersionName())) { + _XUpdate.onUpdateError(CHECK_IGNORED_VERSION); + //校验apk下载缓存目录是否为空 + } else if (TextUtils.isEmpty(updateEntity.getApkCacheDir())) { + _XUpdate.onUpdateError(CHECK_APK_CACHE_DIR_EMPTY); + } else { + updateProxy.findNewVersion(updateEntity, updateProxy); + } + } else { + _XUpdate.onUpdateError(CHECK_NO_NEW_VERSION); + } + } else { + _XUpdate.onUpdateError(CHECK_PARSE, "json:" + result); + } + } + } diff --git a/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/DefaultUpdateParser.java b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/DefaultUpdateParser.java index 419d294..735c130 100644 --- a/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/DefaultUpdateParser.java +++ b/xupdate-lib/src/main/java/com/xuexiang/xupdate/proxy/impl/DefaultUpdateParser.java @@ -21,16 +21,15 @@ import com.xuexiang.xupdate.XUpdate; import com.xuexiang.xupdate.entity.CheckVersionResult; import com.xuexiang.xupdate.entity.UpdateEntity; -import com.xuexiang.xupdate.proxy.IUpdateParser; import com.xuexiang.xupdate.utils.UpdateUtils; /** - * 版本更新解析器 + * 默认版本更新解析器 * * @author xuexiang * @since 2018/7/5 下午4:36 */ -public class DefaultUpdateParser implements IUpdateParser { +public class DefaultUpdateParser extends AbstractUpdateParser { @Override public UpdateEntity parseJson(String json) {