Skip to content

Commit

Permalink
为兼容flutter插件,版本更新解析器新增异步解析方法
Browse files Browse the repository at this point in the history
  • Loading branch information
xuexiangjys committed Feb 15, 2020
1 parent f54d8dc commit 9dc1581
Show file tree
Hide file tree
Showing 10 changed files with 184 additions and 32 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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()
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<AppVersionInfo> apiResult = JsonUtil.fromJson(json, getApiResultType(AppVersionInfo.class));
Expand Down
34 changes: 34 additions & 0 deletions xupdate-lib/src/main/java/com/xuexiang/xupdate/UpdateManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -245,6 +246,15 @@ public void onAfterCheck() {
}
}

@Override
public boolean isAsyncParser() {
if (mIUpdateProxy != null) {
return mIUpdateProxy.isAsyncParser();
} else {
return mIUpdateParser.isAsyncParser();
}
}

/**
* 将请求的json结果解析为版本更新信息实体
*
Expand All @@ -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);
}
});
}
}

/**
* 刷新本地参数
*
Expand Down Expand Up @@ -371,6 +403,8 @@ public void cancelDownload() {
}
}



//============================构建者===============================//

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -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);

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,40 @@
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
*/
public interface IUpdateParser {

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

/**
* [异步解析方法]
* <p>
* 将请求的json结果解析为版本更新信息实体
*
* @param json
* @param callback
* @return
*/
void parseJson(String json, final IUpdateParseCallback callback) throws Exception;

/**
* @return 是否是异步解析
*/
boolean isAsyncParser();

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -50,6 +51,8 @@ public interface IUpdateProxy {
*/
void update();

//=============================//

/**
* 版本检查之前
*/
Expand All @@ -65,14 +68,6 @@ public interface IUpdateProxy {
*/
void onAfterCheck();

/**
* 将请求的json结果解析为版本更新信息实体
*
* @param json
* @return
*/
UpdateEntity parseJson(@NonNull String json) throws Exception;

/**
* 发现新版本
*
Expand All @@ -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;

//=============================//

/**
* 开始下载更新
*
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 9dc1581

Please sign in to comment.