开发界
首页 移动开发 在线交易 IT笔记 网络技术 操作系统 企业架构 数据库 考试认证 IT培训 开源软件 数据存储 行业资讯
大家都在看:java   开发   C#   oracle   mysql   android   web开发   学习   sqlserver   linux   asp   php   ajax   javascript   css   html
解决Android与服务器交互大容量数据问题 (一)
2013-03-06 15:39:11 来源:开发界 作者:admin 栏目:Android平台 责任编辑:admin
[导读]解决Android与服务器交互大容量数据问题

对于目前的状况来说,移动终端的网络状况没有PC网络状况那么理想。在一个Android应用中,如果需要接收来自服务器的大容量数据,那么就不得不考虑客户的流量问题。本文根据笔者的一个项目实战经验出发,解决大容量数据的交互问题,解决数据大小会根据实际情况动态切换问题(服务器动态选择是否要压缩数据,客户端动态解析数据是否是被压缩的),还有数据交互的编码问题。

 

  解决数据过大的问题,最直观的方法就是压缩数据。服务器将需要传递的数据先进行压缩,再发送给Android客户端,Android客户端接收到压缩的数据,对其解压,得到压缩前的数据。

 

  如果规定Android客户端和服务器的交互数据必须是经过某种压缩算法后的数据,那么这种“规定”失去了视具体情况而定的灵活性。笔者拟将Http协议进行封装,将动态的选择传输的数据是否要经过压缩,客户端也能动态的识别,整理并获得服务器想要发送的数据。Android客户端向服务器请求某个方面的数据,这个数据也许是经过压缩后传递比较合适,又也许是将原生数据传递比较合适。也就是说,笔者想要设计一种协议,这种协议适用于传输数据的数据量会动态的切换,也许它会是一个小数据,也许它又会是一个数据量庞大的大数据(大数据需要经过压缩)。

 

  可能说的比较抽象,那么我用实际情况解释一下。

 

  我项目中的一个实际情况是这样的:这个项目是做一个Android基金客户端,Android客户端向服务器请求某一个基金的历史走势信息,由于我的Android客户端实现了本地缓存,这让传递数据的大小浮动非常大。如果本地缓存的历史走势信息的最新日期是5月5日,服务器的历史走势信息的最新日期是5月7日,那么服务器就像发送5月6日和5月7日这两天的走势信息,这个数据很小,不需要压缩(我使用的压缩算法,对于数据量过小的数据压缩并不理想,数据量过小的数据压缩后的数据会比压缩前的数据大)。然而,Android客户端也可能对于某个基金没有任何的缓存信息,那么服务器将发送的数据将是过去三四年间的历史走势信息,这个数据会有点大,就需要进行压缩后传递。那么客户端对于同一个请求得到的数据,如何判断它是压缩后的数据还是未曾压缩的数据呢?

 

  笔者使用的解决方案是把传递数据的第一个字节作为标识字节,将标识这个数据是否被压缩了。也能标识传递数据的编码问题。Android对于接收到的数据(字节数组),先判断第一个字节的数据,就能根据它所代表的数据格式和编码信息进行相应的操作。说了那么多,也许不如看实际的代码理解的快。首先是压缩算法,这里笔者用到的是jdk自带的zip压缩算法。

 

 


  1 package com.chenjun.utils.compress;
  2
  3 import java.io.ByteArrayInputStream;
  4 import java.io.ByteArrayOutputStream;
  5 import java.io.InputStream;
  6 import java.io.OutputStream;
  7 import java.util.zip.GZIPInputStream;
  8 import java.util.zip.GZIPOutputStream;
  9
 10 public class Compress {
 11     private static final int BUFFER_LENGTH = 400;
 12    
 13    
 14     //压缩字节最小长度,小于这个长度的字节数组不适合压缩,压缩完会更大
 15     public static final int BYTE_MIN_LENGTH = 50;
 16    
 17    
 18     //字节数组是否压缩标志位
 19     public static final byte FLAG_GBK_STRING_UNCOMPRESSED_BYTEARRAY = 0;
 20     public static final byte FLAG_GBK_STRING_COMPRESSED_BYTEARRAY = 1;
 21     public static final byte FLAG_UTF8_STRING_COMPRESSED_BYTEARRAY = 2;
 22     public static final byte FLAG_NO_UPDATE_INFO = 3;
 23    
 24     /** 
 25      * 数据压缩 
 26      *  
 27      * @param is 
 28      * @param os 
 29      * @throws Exception 
 30      */ 
 31     public static void compress(InputStream is, OutputStream os)  
 32             throws Exception {  
 33  
 34         GZIPOutputStream gos = new GZIPOutputStream(os);  
 35  
 36         int count;  
 37         byte data[] = new byte[BUFFER_LENGTH];  
 38         while ((count = is.read(data, 0, BUFFER_LENGTH)) != -1) {  
 39             gos.write(data, 0, count);  
 40         }  
 41  
 42         gos.finish();  
 43  
 44         gos.flush();  
 45         gos.close();  
 46     }  
 47    
 48    
 49     /** 
 50      * 数据解压缩 
 51      *  
 52      * @param is 
 53      * @param os 
 54      * @throws Exception 
 55      */ 
 56     public static void decompress(InputStream is, OutputStream os)  
 57             throws Exception {  
 58  
 59         GZIPInputStream gis = new GZIPInputStream(is);  
 60  
 61         int count;  
 62         byte data[] = new byte[BUFFER_LENGTH];  
 63  &nb

版权所有:转载请注明出处!
分享到:
上一篇Android短信接收 下一篇Android 侧边栏开发的方法
您可能还喜欢
今日最新资讯 最新推荐信息
考试认证 更多
开发技术 更多
移动开发 更多

关于开发界 | 合作伙伴 | 联系我们 | 友情链接 | 版权声明 | 网站制作 | 网站地图 | 加入收藏 | 设为首页

Copyright@2012-2016 开发界 京ICP备12027873号