GithubHelp home page GithubHelp logo

wvector / appupdate Goto Github PK

View Code? Open in Web Editor NEW
3.5K 81.0 744.0 49.6 MB

🚀 Android 版本更新 🚀 a library for android version update 🚀

Java 95.59% Kotlin 4.41%
updater android update-checker update easy simple flexible customizable

appupdate's Introduction

Android 版本更新

目录

功能介绍

  • 实现android版本更新
  • 对kotlin适配,调用更简单
  • 自定义接口协议,可以不改变现有项目的协议就能使用
  • 支持get,post请求
  • 支持进度显示,对话框进度条,和通知栏进度条展示
  • 支持后台下载
  • 支持强制更新
  • 支持简单主题色配置(可以自动从顶部图片提取主色)
  • 支持自定义对话框(可以监听下载进度)
  • 支持静默下载(可以设置wifi状态下)
  • 支持android7.0

效果图与示例 apk

点击下载 Demo.apk 或扫描下面的二维码安装

Demo apk文件二维

Gradle 依赖

java方式引用

dependencies {
    compile 'com.qianwen:update-app:3.5.2'
}

Download API License GitHub stars

kotlin方式引用

dependencies {
    compile 'com.qianwen:update-app-kotlin:1.2.3'
}

Download API License GitHub stars

简单使用

1,java方式

	new UpdateAppManager
                .Builder()
                //当前Activity
                .setActivity(this)
                //更新地址
                .setUpdateUrl(mUpdateUrl)
                //实现httpManager接口的对象
                .setHttpManager(new UpdateAppHttpUtil())
                .build()
                .update();

2,kotlin方式

	updateApp(mUpdateUrl, UpdateAppHttpUtil()).update()

详细说明

进度条使用的是代码家的「NumberProgressBar

更新日志

kotlin版本是依赖java版本的,所以java版本的问题kotlin自然修复

v3.5.2

1,修复下载过程中,关闭对话框不能自动安装问题。

v3.5.1

1,修复bug

v3.5.0

1,优化强制更新 

v3.4.8

1,修复bug

v3.4.7

1,优化 APP 安装的问题

v3.4.6

1,优化 APP 安装的问题

v3.4.5

1,增加全局异常捕获方法

                .handleException(new ExceptionHandler() 						{
                @Override
                public void onException(Exception e) {

                }
            })

v3.4.4

1,修复bug

bug

v3.4.3

1,修复bug

bug

v3.4.2

1,修复bug

bug

v3.4.1

1,给插件使用者更多的配置和开启一些钩子方便适配不同的业务需求
2,适配android8.0

感谢Jiiiiiin对项目的维护

v3.4.0

1,修复  

issues#59

v3.3.9

1,适配android8.0的通知和安装未知来源的app

感谢typ0520对项目的维护

v3.3.8

1,增加存储空间权限申请

V3.3.7

1,修改默认安装包下载路径为download/packageName

感谢bean-liu对项目的维护

V3.3.6

1,去掉对下载路径前缀的校验。

#26

V3.3.5

1,修复升级对话框布局中的问题。
2,修复静默下载,关闭更新弹窗 再点击更新 一直显示的问题。

#21

V3.3.4

1,修复对话框更新内容过多,升级按钮被挤压的问题。
2,去掉自动从图片提取颜色的功能, 通过.setThemeColor()设置按钮和精度条颜色,
3,兼容compileSdkVersion <25

V3.3.3

1,修复下载路径是重定向路径不能下载的问题

V3.3.2

1,修复正在下载时,返回桌面报错的问题

#14

V3.3.1

1,修复对话框外可以点击的问题

V3.3.0

1,可以设置不显示通知栏进度条。
2,可以设置忽略版本。 
3,优化下载时页面卡的问题(由于下载进度回调调用频繁,造成ui线程阻塞)。
4,可以静默下载,类似网易云音乐,并且设置wifi状态下。

V3.2.9

1,新增自定义对话框。
2,适配kotlin,写法更简单。 

License

Copyright 2017 千匍

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

appupdate's People

Contributors

bean-liu avatar wvector avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

appupdate's Issues

DEMO报错

从这里下载的DEMO,在AS里可以编译运行,但是把编译过后的APK安装包手动放到手机里安装就会报错,报错如下:
08-24 09:30:46.441 9399-9399/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.vector.appupdatedemo, PID: 9399
java.lang.RuntimeException: Unable to instantiate application com.vector.appupdatedemo.App: java.lang.ClassNotFoundException: Didn't find class "com.vector.appupdatedemo.App" on path: DexPathList[[zip file "/data/app/com.vector.appupdatedemo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:563)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4576)
at android.app.ActivityThread.access$1500(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5310)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.vector.appupdatedemo.App" on path: DexPathList[[zip file "/data/app/com.vector.appupdatedemo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newApplication(Instrumentation.java:1002)
at android.app.LoadedApk.makeApplication(LoadedApk.java:558)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4576) 
at android.app.ActivityThread.access$1500(ActivityThread.java:148) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5310) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
Suppressed: java.lang.ClassNotFoundException: com.vector.appupdatedemo.App
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

java.lang.IllegalArgumentException: unexpected url: www.xxxx.com/xs/xxx/app/xxx_Android_01.01.40.apk

url中存在下划线,好像就会报这个异常。
at okhttp3.Request$Builder.url(Request.java:143)
at com.zhy.http.okhttp.request.OkHttpRequest.initBuilder(OkHttpRequest.java:49)
at com.zhy.http.okhttp.request.OkHttpRequest.(OkHttpRequest.java:39)
at com.zhy.http.okhttp.request.GetRequest.(GetRequest.java:15)
at com.zhy.http.okhttp.builder.GetBuilder.build(GetBuilder.java:31)
at com.mengtai.athome.common.utils.UpdateAppHttpUtil.download(UpdateAppHttpUtil.java:97)

自定义协议,点击升级没有进度条

new UpdateAppManager.Builder()
//必须设置,当前Activity
.setActivity(activity)
//必须设置,实现httpManager接口的对象
.setHttpManager(new UpdateAppHttpUtil())
//必须设置,更新地址
.setUpdateUrl(Urls.UPDATA_APP)
//以下设置,都是可选
//设置请求方式,默认get
.setPost(false)
//添加自定义参数,默认version=1.0.0(app的versionName);apkKey=唯一表示(在AndroidManifest.xml配置)
.setParams(params)
//设置点击升级后,消失对话框,默认点击升级后,对话框显示下载进度
//.hideDialogOnDownloading(false)
//设置头部,不设置显示默认的图片,设置图片后自动识别主色调,然后为按钮,进度条设置颜色
//.setTopPic(R.mipmap.top_8)
//为按钮,进度条设置颜色,默认从顶部图片自动识别。
//.setThemeColor(ColorUtil.getRandomColor())
//设置apk下砸路径,默认是在下载到sd卡下/Download/1.0.0/test.apk
.setTargetPath(path)
//设置appKey,默认从AndroidManifest.xml获取,如果,使用自定义参数,则此项无效
//.setAppKey("ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f")
//不显示通知栏进度条
//.dismissNotificationProgress()
//是否忽略版本
//.showIgnoreVersion()
.build()
//检测是否有新版本
.checkNewApp(new UpdateCallback() {
/**
* 解析json,自定义协议
*
* @param json 服务器返回的json
* @return UpdateAppBean
*/
@OverRide
protected UpdateAppBean parseJson(String json) {
UpdateAppBean updateAppBean = new UpdateAppBean();
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray array = jsonObject.optJSONArray("list");
for (int i = 0; i < array.length(); i ++){
JSONObject obj = array.getJSONObject(i);
if (i == 0){
updateAppBean
//(必须)是否更新Yes,No
.setUpdate("Yes")
//(必须)新版本号,
.setNewVersion(obj.optString("versionNo"))
//(必须)下载地址
//.setApkFileUrl(obj.optString("updateUrl"))
.setApkFileUrl("https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk")
//(必须)更新内容
.setUpdateLog(obj.optString("updateMemo"))
//大小,不设置不显示大小,可以不设置
//.setTargetSize(jsonObject.optString("target_size"))
//设置md5,可以不设置
//.setNewMd5(jsonObject.optString("new_md51"))
//是否强制更新,可以不设置
//.setConstraint(obj.optString("isUpdate").equals("y"));
.setConstraint(true);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return updateAppBean;
}

                /**
                 * 网络请求之前
                 */
                @Override
                public void onBefore() {
                }

                /**
                 * 网路请求之后
                 */
                @Override
                public void onAfter() {
                }

                /**
                 * 没有新版本
                 */
                @Override
                public void noNewApp() {

                }

                /**
                 *  自定义更新对话框
                 * */
                @Override
                protected void hasNewApp(UpdateAppBean updateApp, final UpdateAppManager updateAppManager) {
                    super.hasNewApp(updateApp, updateAppManager);

// String message = updateApp.getUpdateLog();
// boolean isFroce = updateApp.isConstraint();
// DialogUtil.showDiglogNoDismiss(activity, "有新本更新", message, isFroce ? "" : "取消", "升级", isFroce, new DialogUtil.CallBack() {
// @OverRide
// public void onDefault() {
// updateAppManager.download();
// }
// });
}
});

提个建议

检查是否有新版本的功能,是不是没必要做在类库里?类库只需要提示框、下载、安装这些功能就好

本地客户端版本号与服务器版本号一样都是0.8.3,但还是会提示更新

部署服务器后台的代码后,找不到mobileVersionManger/login.html

然后拿sample里的url测试,发现sample里的url只是指向了github里更新的json文件,不管本地版本号是多少,都会返回此json文件并更新。

请求:
OkGo: --> GET https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/json/json.txt?key2=value3&appKey=ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f&appVersion=0.8.3&key1=value2 http/1.1

返回:
OkGo: body:{
"update": "Yes",
"new_version": "0.8.3",
"apk_file_url": "https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk",
"update_log": "1,添加删除信用卡接口。\r\n2,添加vip认证。\r\n3,区分自定义消费,一个小时不限制。\r\n4,添加放弃任务接口,小时内不生成。\r\n5,消费任务手动生成。",
"target_size": "5M",
"new_md5":"295687E756F569C7159974DD493489A5",
"constraint": false
}

正常:
{
"update": "No",//没有新版本
}

静默下载 问题 demo

静默下载,关闭更新弹窗 再点击更新 一直显示 “app正在更新” DownloadService.isRunning一直 true

异常

在三星手机上会报错:API 18
Unable to get provider com.vector.update_app.UpdateFileProvider: java.lang.ClassNotFoundException: Didn't find class "com.vector.update_app.UpdateFileProvider" on path: /data/app/com.redocn.redocn-1.apk

自定义协议+自定义对话框,怎么还会弹窗默认的对话框

new UpdateAppManager.Builder()
//必须设置,当前Activity
.setActivity(activity)
//必须设置,实现httpManager接口的对象
.setHttpManager(new UpdateAppHttpUtil())
//必须设置,更新地址
.setUpdateUrl(Urls.UPDATA_APP)
//以下设置,都是可选
//设置请求方式,默认get
.setPost(false)
//添加自定义参数,默认version=1.0.0(app的versionName);apkKey=唯一表示(在AndroidManifest.xml配置)
.setParams(params)
//设置点击升级后,消失对话框,默认点击升级后,对话框显示下载进度
//.hideDialogOnDownloading(true)
//设置头部,不设置显示默认的图片,设置图片后自动识别主色调,然后为按钮,进度条设置颜色
//.setTopPic(R.mipmap.top_8)
//为按钮,进度条设置颜色,默认从顶部图片自动识别。
//.setThemeColor(ColorUtil.getRandomColor())
//设置apk下砸路径,默认是在下载到sd卡下/Download/1.0.0/test.apk
.setTargetPath(path)
//设置appKey,默认从AndroidManifest.xml获取,如果,使用自定义参数,则此项无效
//.setAppKey("ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f")
//不显示通知栏进度条
//.dismissNotificationProgress()
//是否忽略版本
//.showIgnoreVersion()
.build()
//检测是否有新版本
.checkNewApp(new UpdateCallback() {
/**
* 解析json,自定义协议
*
* @param json 服务器返回的json
* @return UpdateAppBean
*/
@OverRide
protected UpdateAppBean parseJson(String json) {
UpdateAppBean updateAppBean = new UpdateAppBean();
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray array = jsonObject.optJSONArray("list");
for (int i = 0; i < array.length(); i ++){
JSONObject obj = array.getJSONObject(i);
if (i == 0){
updateAppBean
//(必须)是否更新Yes,No
.setUpdate("Yes")
//(必须)新版本号,
.setNewVersion(obj.optString("versionNo"))
//(必须)下载地址
//.setApkFileUrl(obj.optString("updateUrl"))
.setApkFileUrl("https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk")
//(必须)更新内容
.setUpdateLog(obj.optString("updateMemo"))
//大小,不设置不显示大小,可以不设置
//.setTargetSize(jsonObject.optString("target_size"))
//设置md5,可以不设置
//.setNewMd5(jsonObject.optString("new_md51"))
//是否强制更新,可以不设置
.setConstraint(obj.optString("isUpdate").equals("y"));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return updateAppBean;
}

                /**
                 * 网络请求之前
                 */
                @Override
                public void onBefore() {
                }

                /**
                 * 网路请求之后
                 */
                @Override
                public void onAfter() {
                }

                /**
                 * 没有新版本
                 */
                @Override
                public void noNewApp() {

                }

                /**
                 *  自定义更新对话框
                 * */
                @Override
                protected void hasNewApp(UpdateAppBean updateApp, final UpdateAppManager updateAppManager) {
                    super.hasNewApp(updateApp, updateAppManager);

// String message = updateApp.getUpdateLog();
// boolean isFroce = updateApp.isConstraint();
// DialogUtil.showDiglogNoDismiss(activity, "有新本更新", message, isFroce ? "" : "取消", "升级", isFroce, new DialogUtil.CallBack() {
// @OverRide
// public void onDefault() {
// updateAppManager.download();
// }
// });
}

用夜神模拟器运行会有问题.

Didn't find class "com.vector.update_app.UpdateFileProvider" on path: DexPathList[[zip file "/data/app/com.pancool.ymi-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.pancool.ymi-2, /system/lib]]

每次弹出都先显示默认的红色背景

谢谢开源这个好用的库,发现一个小问题,设置的背景图片之后,弹出升级提示的背景经常能看到由默认的红色背景变成我设置的那个背景

下载路径错误:/storage/C33C-1BF6/Download

千匍,您好

最近在使用您开发的升级库遇到一点小问题,在测试的时候,我使用的是

华为Che1-CL10的手机

  • 系统EMUI4.0
  • Android版本6.0.1

点击更新APP(默认),就是最简单的更新按钮,控制台提示

  • 下载路径错误:/storage/C33C-1BF6/Download

我看了一下您的代码,在UpdateAppManager.java中,第140行的verify()函数

有一个preSuffix验证,限定了下载路径必须是要以"/storage/emulated"开头的

这里修改一下会不会好一些,

通过判断是否装载了SD卡会不会好一些,否则有些手机就没法下载了。

直接让后台控制更新不太好吧

直接让后台通过update在判断更新,如果我已经是最新的apk,每次进去还是会提示这个鬼东西,感觉还是使用版本判断比较靠谱!

在强制更新的时候,在更新界面,还没点击升级按钮,把程序切换置后台,再切换回来,提示app正在更新,其实并没有点击升级按钮,感觉提示语不恰当

在强制更新的情况下,我写的逻辑是,在oncreate方法里面调接口看有没有版本更新,如果有,就在本地存放一个true,没有就存放false,我在onResume方法里面,获取存放的这个值。如果是最新版本(已更新,没有最新版会存放false),更新弹窗就不出来了,如果不是最新版本,弹窗还照样出来。

建议

使用原有的弹窗点击取消后望能增加操作,或者检测到弹窗被取消。

自定义 json 格式的建议

很好的更新库,但是能够支持自定义返回 json 格式就更好了。例如开放 json-> model 的解析接口。

我导入发生了错误

Process: tsinghua.com.villageassistantclick, PID: 13145
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NoClassDefFoundError: okhttp3.internal.http.HttpEngine
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:219)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170)
at okhttp3.RealCall.execute(RealCall.java:60)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
at rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80)
at rx.Subscriber.setProducer(Subscriber.java:209)
at rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76)
at rx.Subscriber.setProducer(Subscriber.java:205)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
at rx.Observable.unsafeSubscribe(Observable.java:8666)
at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:220)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:841) 

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1842)
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1860)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:650)
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:609)
    at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:205)
    at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:171)
    at com.vector.update_app.UpdateDialogFragment$4.onFinish(UpdateDialogFragment.java:312)
    at com.vector.update_app.service.DownloadService$FileDownloadCallBack.onResponse(DownloadService.java:256)
    at com.vector.appupdatedemo.http.UpdateAppHttpUtil$3.onResponse(UpdateAppHttpUtil.java:102)
    at com.vector.appupdatedemo.http.UpdateAppHttpUtil$3.onResponse(UpdateAppHttpUtil.java:89)
    at com.zhy.http.okhttp.OkHttpUtils$5.run(OkHttpUtils.java:256)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5315)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
    at dalvik.system.NativeStart.main(Native Method)

你好,无意间发现这个库,非常感谢你提供这么方便的库,不过今天下载你的demo尝试时:点击下载,然后按home键返回桌面做其他的事,在下载完了之后就会出现这个异常。
定位错误出现在demo中的UpdateDialogFragment的312行

  @Override
                public boolean onFinish(File file) {
                    if (!UpdateDialogFragment.this.isRemoving()) {
                        dismiss();
                    }
                    return true;
                }

中的dismiss();
测试时用的华为和小米,系统版本分别是4.4和5.0,两者都会出现这种情况。你可以试一下。

isUpdate() 判断问题。

”update": "Yes"的时候,就更新。如果下载了更新,并安装了,点更新的话还是会继续弹窗提示有更新?
而不是提示“已经是最新版本”。

建议作者改善或者去掉appIsDownloaded中MD5值的判断

可以提供获取当前apk 的MD5值的方法,然后与下载的文件的MD5值进行对比,这样就完美了..
源码里面的manifest里面设置的MD5值是死的,估计是想让我们替换为自己的md5值吧,而且服务器如果不返回MD5值的话,建议使用另外的方式去判断当前APK和新的APK的区别,谢谢大佬

If I havn't appKey

No doubt this is great library ever, I'm using dropbox to update.txt but library assign appKey and version associate with link. Dropbox just handle following link, How I manage this condition? Please help me

08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: <-- 400  https://dl.dropboxusercontent.com/s/3ah4tgrwd361uu9/update.txt?appKey=null&version=23.6002817 (7383ms)
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	server: nginx
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	date: Wed, 02 Aug 2017 18:16:18 GMT
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	content-type: text/html
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	x-dropbox-request-id: 5cd5db4b86c5f15d656d799827f2fee5
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	x-robots-tag: noindex, nofollow, noimageindex
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp:  

日志显示下载成功,但界面提示“更新新版本出错,未知异常 code=200”

打印出来的日志显示成功,但界面提示“更新新版本出错,未知异常 code=200”
日志如下(为了防止攻击,我在http:// 后面加了空格):
08-08 14:10:22.169 20642-20698/? I/okHttp: <-- 200 OK http:// 3a3g.cn/app-1.1.apk (23ms)
08-08 14:10:22.169 20642-20698/? I/okHttp: Date: Tue, 08 Aug 2017 06:10:13 GMT
08-08 14:10:22.169 20642-20698/? I/okHttp: Server: Apache/2.4.25 (Win64) PHP/5.6.30
08-08 14:10:22.169 20642-20698/? I/okHttp: Accept-Ranges: bytes
08-08 14:10:22.169 20642-20698/? I/okHttp: ETag: W/"2355487-1502168009865"
08-08 14:10:22.169 20642-20698/? I/okHttp: Last-Modified: Tue, 08 Aug 2017 04:53:29 GMT
08-08 14:10:22.169 20642-20698/? I/okHttp: Content-Type: application/vnd.android.package-archive
08-08 14:10:22.169 20642-20698/? I/okHttp: Content-Length: 2355487
08-08 14:10:22.169 20642-20698/? I/okHttp: Keep-Alive: timeout=5, max=99
08-08 14:10:22.169 20642-20698/? I/okHttp: Connection: Keep-Alive
08-08 14:10:22.169 20642-20698/? I/okHttp:
08-08 14:10:22.170 20642-20698/? I/okHttp: body: maybe [file part] , too large too print , ignored!
08-08 14:10:22.170 20642-20698/? I/okHttp: <-- END HTTP

下载中 页面滑动卡顿

在下载过程中 是否能关闭dialog 让在后台下载

我修改了源码 在下载中 关闭dialog 但是在下载中的时候 页面滑动非常卡顿 不知道为什么

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.