当前位置:  编程技术>移动开发
本页文章导读:
    ▪手机端靠山向前台传输数据的二进制压缩方法        手机端后台向前台传输数据的二进制压缩方法 后端取出数据后发给前端,原本我们使用json格式传输,每次传输将近1k左右,但是为了给用户省流量,我们采取先把json去掉每一个key,转换.........
    ▪ Socket中判断是不是处于连接状态的方法        Socket中判断是否处于连接状态的方法 工程里遇到了需要判断Socket是否已经关闭的问题,使用 public boolean isAlive(){ if(mSocket.equals(null)||mSocket.isClosed()||!mSocket.isConnected()||mSocket.isInputShutdown().........
    ▪ 磁盘运算规律       磁盘运算法则 存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数 ......

[1]手机端靠山向前台传输数据的二进制压缩方法
    来源: 互联网  发布时间: 2014-02-18
手机端后台向前台传输数据的二进制压缩方法
后端取出数据后发给前端,原本我们使用json格式传输,每次传输将近1k左右,但是为了给用户省流量,我们采取先把json去掉每一个key,转换为二进制,然后gzip压缩,这样操作下来节省了70%的数据量,效果很好。

具体方法:
原有返回格式是这样
<StoresList>
<return>
      {
      "status": {
      "request_status": "0",
      "error_code": "BTMes0100002",
      "error_msg": "success"
      },
      "bizobj": [
      {
      "STORE_ID": 1,
      "STORE_NAME": "肯德基",
      "STORE_PHONE": "4008-823823",
      "STORE_ADDRESS": "文二路肯德基店",
      "STORE_LAT": "30.33331",
      "STORE_LONG": "120.22221",
      "PHOTO_TYPE": 2,
      "RESOLUTION_TYPE": 2,
      "PHOTO_URL": "http://www.kendeji.com/a.jpg"
      }, {
      "STORE_ID": 2,
      "STORE_NAME": "麦当劳",
      "STORE_PHONE": "15233336666",
      "STORE_ADDRESS": "文一路麦当劳店",
      "STORE_LAT": "30.33332",
      "STORE_LONG": "120.22222",
      "PHOTO_TYPE": 2,
      "RESOLUTION_TYPE": 2,
      "PHOTO_URL": "http://www.maidanglao.com/a.jpg"
      }  ],
      "page_info": {
      "cur_page": "1",
      "page_size": "12",
      "total_items": "3"
      }
      }
    </return>
  </StoresList>



我们约定每一个属性的长度,在一个xml文件中写成这样
<storeList id="status">							
	<request_status>4</request_status>
	<error_code>4</error_code>
	<error_msg>40</error_msg>	
</storeList>	
<storeList id="page_info">
	<cur_page>4</cur_page>
	<page_size>4</page_size>
	<total_items>4</total_items>	
</storeList>	
<storeList id="bizobj">		
		<STORE_ID>4</STORE_ID>
		<STORE_NAME>50</STORE_NAME>
		<STORE_PHONE>16</STORE_PHONE>
		<STORE_ADDRESS>50</STORE_ADDRESS>			
		<STORE_LAT>12</STORE_LAT>
		<STORE_LONG>12</STORE_LONG>		
		<PHOTO_TYPE>4</PHOTO_TYPE>
		<RESOLUTION_TYPE>4</RESOLUTION_TYPE>		
		<PHOTO_URL>50</PHOTO_URL>		
		<CLASS_ID>4</CLASS_ID>			
		<STORE_URL>50</STORE_URL>	
		<distance>6</distance>	
</storeList>

然后依次遍历每个storelist下的节点的ElementName以及ElementValue ,即可通过elementName得到json中的值,通过elementValue来给json中的值转换为byte[],并且前补零。
最后把要拼装的jsonobject或者jsonarray的byte数组拼装成一个byte【】,然后对其gzip即可
public class BinaryUtil {
	/**
	 * jsonobj转换为byte数组
	 * @param jsonObj
	 * @param charset
	 * @param xmlParameter
	 * @return
	 * @throws UnsupportedEncodingException
	 * @throws DocumentException
	 */
	public static byte[] convertJsonObj2ByteArray(JSONObject jsonObj, String charset,
			XmlParameter xmlParameter) throws UnsupportedEncodingException,
			DocumentException {
		List<Jsonvalue> list = new ArrayList<Jsonvalue>();
		List<XmlBean> xmllist = combineBizobj(xmlParameter);
		for (XmlBean bean : xmllist) {
			String name = jsonObj.getString(bean.getAttributeName());
			Integer value = bean.getAttributeValue();
			list.add(change2Jsonvalue(name, value, charset));
		}
		return combineList(list, charset);
	}

	/**
	 * jsonarray转换为byte数组
	 * @param jsonArray
	 * @param charset
	 * @param xmlParameter
	 * @return
	 * @throws DocumentException
	 * @throws UnsupportedEncodingException
	 */
	public static byte[] convertJsonArray2ByteArray(JSONArray jsonArray,
			String charset, XmlParameter xmlParameter)
			throws DocumentException, UnsupportedEncodingException {
		if (jsonArray == null) {
			return null;
		}
		int arraySize = jsonArray.size();
		List<Jsonvalue> list = new ArrayList<Jsonvalue>();
		List<XmlBean> xmllist = combineBizobj(xmlParameter);
		for (int i = 0; i < arraySize; i++) {
			for (XmlBean bean : xmllist) {
				String name = jsonArray.getJSONObject(i).getString(
						bean.getAttributeName());
				Integer value = bean.getAttributeValue();
				list.add(change2Jsonvalue(name, value, charset));
			}
		}
		return combineList(list, charset);
	}

	/**
	 * 合并多个byte数组,合并后的长度为多个子数组的和
	 * @param charset
	 * @param firstByteArray
	 * @param secondByteArray
	 * @param objects
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static byte[] combineByteArray(String charset,byte[] firstByteArray,
			byte[] secondByteArray, Object... objects) throws UnsupportedEncodingException {
		if (firstByteArray == null) {
			return secondByteArray;
		} else if (secondByteArray == null) {
			return firstByteArray;
		} else {
			StringBuffer sb=new StringBuffer();
			sb.append(new String(firstByteArray));
			sb.append(new String(secondByteArray));
			
			if (objects != null) {
				int j = objects.length;
				for(int i=0;i<j;i++){
					sb.append(new String((byte[])objects[i]));
				}
			}
			return sb.toString().getBytes(charset);
		}
	}

	/**
	 * 获得一个接口对应的所有的id
	 * @param xmlParameter
	 * @return
	 * @throws DocumentException
	 */
	public static List<String> getIds(XmlParameter xmlParameter)
			throws DocumentException {
		List<String> list = new ArrayList<String>();
		List<Element> elist = getElementList(xmlParameter);
		for (Element e : elist) {
			list.add(e.attributeValue("id"));
		}
		return list;
	}
	
	/**
	 * gzip压缩数据
	 * @param data
	 * @return
	 * @throws IOException
	 */
	public static byte[] gzipData(byte[] data) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		GZIPOutputStream gzos = new GZIPOutputStream(bos);
		gzos.write(data);
		gzos.close();
		return bos.toByteArray();
	}

	/**
	 * 获得接口名称对应的配置元素列表
	 * @param method
	 * @return
	 * @throws DocumentException
	 */
	@SuppressWarnings("unchecked")
	private static List<Element> getElementList(XmlParameter xmlParameter)
			throws DocumentException {
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read(xmlParameter.getXmlPath());
		Element root = document.getRootElement();
		List<Element> elist = root.selectNodes(xmlParameter.getElementName());
		return elist;
	}

	

	private static byte[] combineList(List<Jsonvalue> list, String charset)
			throws UnsupportedEncodingException {
		StringBuffer result = new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			result.append(new String(list.get(i).getB()));
		}
		String f = result.toString();
		return f.getBytes(charset);
	}

	/**
	 * 前补零
	 * @throws UnsupportedEncodingException 
	 */
	private static byte[] fillZero(String charset,byte[] s, int bytesSize) throws UnsupportedEncodingException {
		byte[] zreo = new byte[1];
		zreo[0] = 0;
		while (s.length < bytesSize) {
			s = combineByteArray(charset,zreo, s);
		}
		return s;
	}

	private static Jsonvalue change2Jsonvalue(String value, Integer length,
			String charset) throws UnsupportedEncodingException {
		Jsonvalue jv = new Jsonvalue(fillZero(charset,value.getBytes(charset), length),
				length);
		return jv;
	}

	/**
	 * 获得一个element对应的所有节点
	 * 
	 * @param xmlParameter
	 * @return
	 * @throws DocumentException
	 */
	@SuppressWarnings("unchecked")
	private static List<XmlBean> combineBizobj(XmlParameter xmlParameter)
			throws DocumentException {
		List<XmlBean> list = new ArrayList<XmlBean>();
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read(xmlParameter.getXmlPath());
		Element root = document.getRootElement();
		List<Element> elist = root.selectNodes(xmlParameter.getElementName());
		for (Element e : elist) {
			if (e.attribute("id").getValue()
					.equalsIgnoreCase(xmlParameter.getElementId())) {
				List<Element> list1 = e.elements();
				for (Element ee : list1) {
					XmlBean xmlBean = new XmlBean(ee.getName(),
							Integer.parseInt(ee.getData().toString()));
					list.add(xmlBean);
				}
			}
		}
		return list;
	}
}


压缩包见附件包含本身的jar以及依赖的jar

    
[2] Socket中判断是不是处于连接状态的方法
    来源: 互联网  发布时间: 2014-02-18
Socket中判断是否处于连接状态的方法
工程里遇到了需要判断Socket是否已经关闭的问题,使用
public boolean isAlive(){
			if(mSocket.equals(null)||mSocket.isClosed()||!mSocket.isConnected()||mSocket.isInputShutdown()||mSocket.isOutputShutdown()){
				MyLog.d("mSocket.isConnected()"+mSocket.isConnected());
				return false;
			}else{
				MyLog.d("mSocket.isConnected()"+mSocket.isConnected());

				return true;

			}
		}

毫无作用,随后查看了网上先关解决办法,发现Socket中有一个方法void sendUrgentData(0xFF)当对方SO_OOBINLINE属性没有打开时,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的,但是只要能够发送到对方Socket,sendUrgentData(0xFF)方法就不会报错,只要catch一下IOException就OK了,当对方关掉了Socket之后就会进入catch,问题迎刃而解。
try{
						     
mSocket.sendUrgentData(0xFF);

}catch(IOException e){
Log.d(e+":要关掉了阿 !");
	mSocket.close();
						
						
}

当socket断掉之后,抛出java.net.socketexception broken pipe异常,没有问题。

    
[3] 磁盘运算规律
    来源: 互联网  发布时间: 2014-02-18
磁盘运算法则

存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3