@martin0207
2017-12-13T06:29:03.000000Z
字数 2384
阅读 1064
开发技能
在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"都有可能,那么,我能怎么办,只能想办法了。
小数点这么多,我们没有办法对比两个String型版本号,哪个版本更高些,当然如果版本升级特别严谨,我们可以取巧用:
String serverVersion = "1.0.2";String localVersion = "1.0.1";if (serverVersion.equals(localVersion)) {// 对比版本号是否一致,不一致就升级}
哇,好方便!但是简单的方法一般都隐藏着未知BUG,那么,这个方法的BUG是什么?我也不清楚……
小数点是我们对比大小的障碍,那么我们去除掉小数点呢?
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存在。
既然字符串被"."充斥着,也可以被看做分割成了很多块。那么我们把每一块拿出来组成个数组,然后对数组里的内容挨个对比呢?
真是天才!一缸米有望了
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: 小心,我要赚一缸米了!
又偷偷写完一篇文章,米缸里多存了一粒米,距离满缸还差的远。
但是我有女朋友啊!