[关闭]
@martin0207 2017-12-13T06:29:03.000000Z 字数 2384 阅读 941

版本号比对(1.0.1)

开发技能


前言

在Android开发中,我们不可避免的会涉及到版本升级,为了简单,我们更喜欢使用“1.1”这种小数型版本号,直接Double.valueOf(version)获取小数型版本号,对比判断是否需要升级。
附上获取本地APP版本号方法:

  1. /**
  2. * 返回当前程序版本名
  3. */
  4. public static String getAppVersionName(Context context) {
  5. String versionName = "";
  6. int versioncode = 0;
  7. try {
  8. // ---get the package info---
  9. PackageManager pm = context.getPackageManager();
  10. PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0);
  11. versionName = info.versionName;
  12. versioncode = info.versionCode;
  13. if (versionName == null || versionName.length() <= 0) {
  14. return "";
  15. }
  16. } catch (Exception e) {
  17. Log.e("VersionInfo", "Exception", e);
  18. }
  19. return versionName;
  20. }

但是,我们发现,市场上的应用,版本号并不是只有一个小数点的类型,"1.0.1"甚至"1.0.1.2.3.6"都有可能,那么,我能怎么办,只能想办法了。

实现方法

1. 最简对比版本

小数点这么多,我们没有办法对比两个String型版本号,哪个版本更高些,当然如果版本升级特别严谨,我们可以取巧用:

  1. String serverVersion = "1.0.2";
  2. String localVersion = "1.0.1";
  3. if (serverVersion.equals(localVersion)) {
  4. // 对比版本号是否一致,不一致就升级
  5. }

哇,好方便!但是简单的方法一般都隐藏着未知BUG,那么,这个方法的BUG是什么?我也不清楚……

2. 去除小数点

小数点是我们对比大小的障碍,那么我们去除掉小数点呢?

  1. String serverVersion = "1.0.2";
  2. String localVersion = "1.0.1";
  3. String sVersion = serverVersion.replace(".", "");
  4. String lVersion = localVersion.replace(".", "");
  5. if (Integer.valueOf(sVersion)>Integer.valueOf(lVersion)) {
  6. // 去除掉小数点后,转为整数型,对比版本大小
  7. }

比第一种方法要麻烦一点,但是貌似结果还不错?
NO,NO,NO!
老板告诉你,明天升级版本到"1.1.0",但是目前版本是"1.0.11",对比的结果是:

  1. if( 110 > 1011 ){
  2. //这样子可不能更新啊
  3. }

所以,这个方法还是最好不要用,作为定下小目标一缸米的程序员,肯定不能忍受这种隐藏BUG存在。

3. 化为数组

既然字符串被"."充斥着,也可以被看做分割成了很多块。那么我们把每一块拿出来组成个数组,然后对数组里的内容挨个对比呢?
真是天才!一缸米有望了

  1. String serverVersion = "1.0.2";
  2. String localVersion = "1.0.1";
  3. String[] sArr = serverVersion.split(".");
  4. String[] lArr = localVersion.split(".");
  5. boolean needUpdate = false; // 是否需要更新
  6. for (int i = 0; i < sArr.length; i++) {
  7. Integer lI = Integer.valueOf(lArr[i]);
  8. Integer sI = Integer.valueOf(sArr[i]);
  9. if (sI > lI) {
  10. needUpdate = true;
  11. //从前向后对比,如果大于成立,直接跳出循环
  12. // 2.0.0 对比 1.9.99,只需要对比 2>1 即可
  13. break;
  14. }
  15. }
  16. if (needUpdate) {
  17. //TODO 做升级操作
  18. Log.e(TAG, "test: 小心,我要赚一缸米了!");
  19. }

代码写完了,就是往后半年回头看,这也是一手秀丽的代码啊!来,运行一下:

唉,我的米呢?
打印转成的数组,我发现,serverVersion.split(".")并不能生成我想要的数组!我被代码骗了。
可以想见,split方法应该是对"."不感冒,无法分解字符串,那么为了一缸米,我、我把"."换成","不就完了!

  1. String[] sArr = serverVersion.replace(".",",").split(",");
  2. String[] lArr = localVersion.replace(".",",").split(",");
  3. 12-13 14:20:20.296 1193-1193/? E/MainActivity: test: 小心,我要赚一缸米了!

果然,split"."没兴趣,它喜欢大的。

好了,结果很完美,我离一缸米又近了一步。
但是!
作为定下伟大小目标的程序员,怎么可以因为split喜欢大的,就望而却步呢!我查看了“源码”<百度知道>后,发现,其实只要转移一下,split就可以识别了:

  1. String[] sArr = serverVersion.split("\\.");
  2. String[] lArr = localVersion.split("\\.");
  3. 12-13 14:25:03.853 2931-2931/com.martin.testdemo E/MainActivity: test: 小心,我要赚一缸米了!

结语

又偷偷写完一篇文章,米缸里多存了一粒米,距离满缸还差的远。
但是我有女朋友啊!

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注