版本号比对(1.0.1)

版本号比对(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: 小心,我要赚一缸米了!

结语

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

我的作业部落

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值