版本号比对(1.0.1)
标签(空格分隔): 开发技能
前言
在Android开发中,我们不可避免的会涉及到版本升级,为了简单,我们更喜欢使用“1.1”这种小数型版本号,直接Double.valueOf(version)
获取小数型版本号,对比判断是否需要升级。
附上获取本地APP版本号方法:
/**
* 返回当前程序版本名
*/
public static String getAppVersionName(Context context) {
String versionName = "";
int versioncode = 0;
try {
// ---get the package info---
PackageManager pm = context.getPackageManager();
PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0);
versionName = info.versionName;
versioncode = info.versionCode;
if (versionName == null || versionName.length() <= 0) {
return "";
}
} catch (Exception e) {
Log.e("VersionInfo", "Exception", e);
}
return versionName;
}
但是,我们发现,市场上的应用,版本号并不是只有一个小数点的类型,"1.0.1"
甚至"1.0.1.2.3.6"
都有可能,那么,我能怎么办,只能想办法了。
实现方法
1. 最简对比版本
小数点这么多,我们没有办法对比两个String型版本号,哪个版本更高些,当然如果版本升级特别严谨,我们可以取巧用:
String serverVersion = "1.0.2";
String localVersion = "1.0.1";
if (serverVersion.equals(localVersion)) {
// 对比版本号是否一致,不一致就升级
}
哇,好方便!但是简单的方法一般都隐藏着未知BUG,那么,这个方法的BUG是什么?我也不清楚……
2. 去除小数点
小数点是我们对比大小的障碍,那么我们去除掉小数点呢?
String serverVersion = "1.0.2";
String localVersion = "1.0.1";
String sVersion = serverVersion.replace(".", "");
String lVersion = localVersion.replace(".", "");
if (Integer.valueOf(sVersion)>Integer.valueOf(lVersion)) {
// 去除掉小数点后,转为整数型,对比版本大小
}
比第一种方法要麻烦一点,但是貌似结果还不错?
NO,NO,NO!
老板告诉你,明天升级版本到"1.1.0"
,但是目前版本是"1.0.11"
,对比的结果是:
if( 110 > 1011 ){
//这样子可不能更新啊
}
所以,这个方法还是最好不要用,作为定下小目标一缸米的程序员,肯定不能忍受这种隐藏BUG存在。
3. 化为数组
既然字符串被"."
充斥着,也可以被看做分割成了很多块。那么我们把每一块拿出来组成个数组,然后对数组里的内容挨个对比呢?
真是天才!一缸米有望了
String serverVersion = "1.0.2";
String localVersion = "1.0.1";
String[] sArr = serverVersion.split(".");
String[] lArr = localVersion.split(".");
boolean needUpdate = false; // 是否需要更新
for (int i = 0; i < sArr.length; i++) {
Integer lI = Integer.valueOf(lArr[i]);
Integer sI = Integer.valueOf(sArr[i]);
if (sI > lI) {
needUpdate = true;
//从前向后对比,如果大于成立,直接跳出循环
// 2.0.0 对比 1.9.99,只需要对比 2>1 即可
break;
}
}
if (needUpdate) {
//TODO 做升级操作
Log.e(TAG, "test: 小心,我要赚一缸米了!");
}
代码写完了,就是往后半年回头看,这也是一手秀丽的代码啊!来,运行一下:
唉,我的米呢?
打印转成的数组,我发现,serverVersion.split(".")
并不能生成我想要的数组!我被代码骗了。
可以想见,split
方法应该是对"."
不感冒,无法分解字符串,那么为了一缸米,我、我把"."
换成","
不就完了!
String[] sArr = serverVersion.replace(".",",").split(",");
String[] lArr = localVersion.replace(".",",").split(",");
12-13 14:20:20.296 1193-1193/? E/MainActivity: test: 小心,我要赚一缸米了!
果然,split
对"."
没兴趣,它喜欢大的。
好了,结果很完美,我离一缸米又近了一步。
但是!
作为定下伟大小目标的程序员,怎么可以因为split
喜欢大的,就望而却步呢!我查看了“源码”<百度知道>后,发现,其实只要转移一下,split
就可以识别了:
String[] sArr = serverVersion.split("\\.");
String[] lArr = localVersion.split("\\.");
12-13 14:25:03.853 2931-2931/com.martin.testdemo E/MainActivity: test: 小心,我要赚一缸米了!
结语
又偷偷写完一篇文章,米缸里多存了一粒米,虽然距离满缸还差的远。
但是我有女朋友啊!