当前位置:阳光沙滩 >Android > 查看文章

1.情景:

天气不太晴朗,我已经辞职,心情不那么好,老板还找我改需求。

描述:这其实是检查更新版本后下载最新的APP下來。那么接口里返回的数据只有:

版本更新检查 Index/version

发送字段
	code= 版本号 ( 如 20151129)
	
返回字段

{
	"result": "0", //1 为无新版本 , 0 为有新版本
	"msg": "Success",
	"data": {
	"version": "v1.1.8", // 版本号
	"message": " 正式上线 ", // 更新内容
	"android_path": "http://www.sunofbeaches.com/xxx/xxx/apk/20151130.apk", //apk 下载路径
	"forced": "0" //1 为强制更新 0 为普通更新
}

 

大家不知道有沒有发现,这里返回的数据沒有这個总的大小。也就是說,我在下载app的时候,不能告诉用户已经占总的大小是多少。这样,只能用转圈圈的形式。体验非常不好。一個app要是二十兆,假设500KB/S,需要大概五十秒的时间。用户不知道的情况下是很难等待的,是相当漫长的。所以我们要改成进度条的形式。

问题來了:沒有返回总的大小数据,后台那哥们不改。沒办法,人长得丑,沒朋友。后台不改,只能自己动手了。

解决办法:想起小时候学习的Http协议里头有一個head请求,这個请求可以获取到头部的信息,嘻嘻。这样就可以获取到这個apk的大小了。不信我们看看结果吧!

 

2.沒有获取到总的大小

是这個样子的,看看吧!

progress

是不是很难看,我在中间已经暂停录制了差不多二十秒。这样子真的等很久的哦。

3.解决办法

第一种方法可以直接让后台返回整个apk的大小给你,你直接用当前的下载长度/总的长度,就可以得到百分比了。

第二种方法,则是不修改返回字段的情况下,我们用http的head请求來获取得信息。

 URL url ;
            try {
                url = new URL(mDownUrl);

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                // conn.setDoOutput(true);
                conn.setRequestMethod("HEAD");

                Map<String, List<String>> headerMap = conn.getHeaderFields();
                Iterator<String> iterator = headerMap.keySet().iterator();
                while (iterator.hasNext()) {
                    String key = iterator.next();
                    List<String> values = headerMap.get(key);

                    System.out.println(key + ":" + values.toString());
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

其中mDownUrl是apk的下载地址。这样子,我们就可以获得返回的信息如下:

I/System.out: null:[HTTP/1.1 200 OK]
I/System.out: Accept-Ranges:[bytes]
I/System.out: Connection:[keep-alive]
I/System.out: Content-Length:[18226012]
I/System.out: Content-Type:[application/octet-stream]
I/System.out: Date:[Sat, 16 Apr 2016 14:31:45 GMT]
I/System.out: ETag:["570c530c-1161b5c"]
I/System.out: Last-Modified:[Tue, 12 Apr 2016 01:44:44 GMT]
I/System.out: Server:[nginx/1.7.8]
I/System.out: X-Android-Received-Millis:[1460817114419]
I/System.out: X-Android-Sent-Millis:[1460817114333]

其中

I/System.out: Content-Length:[18226012]

 

这個就是文件的大小。看数据就知道了,通过键我们就可以获得值了。

看看我们是不是对的哈,我直接复制地址到浏览器上下载:

qq%e5%9b%be%e7%89%8720160415232758

充分地证明了我们的方法是对D,嘻嘻!接下來的动作就产需要我教了吧,看完之后要有收获哦!允许点赞!

7K
为您推荐
各种观点