zoukankan      html  css  js  c++  java
  • android如何从网络中获取数据

    android 因为整合了apache,所有支持所有的http请求,但作为嵌入式的终端,不仅需要支持get/post这种请求,

    还需要支持不同的APN(CMNET/CMWAP),总得来说只要能连上了一个APN,其他网络都是可以调通的,第一需要底层

    设置相关的参数(host, username/passwd, ip)。第二如果需要代理的,如cmwap需要添加相应的proxy,如下所示:

    	if (Constant.IS_CMWAP_APN) {
    				httpclient.getCredentialsProvider().setCredentials(new AuthScope(Constant.proxyUrl, Constant.proxyPort), new UsernamePasswordCredentials("cmwap", "cmwap"));
    				HttpHost proxy = new HttpHost(Constant.proxyUrl, Constant.proxyPort);
    				httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
    			}
    

    不然出现网络信号有了,就是拿不到数据,log中报socket timeout.你也可以通过在console端ping,看是不是有回包。

    2. 由于网络数据太长,不可能一次性拿完,所有涉及到切割保存的问题,如果数据是中文,必须按照byte的形式保存,如果按照

    下面的形式进行保存会有二个问题

     A:中文乱码,如果返回是xml,会导致解析xml文件出错,因为一个文中字符占2个字节,readline时刚好把中文切掉半个,所以在

    文档就会显示乱码,如果刚好是"<",">"就会出现解析错误。

    B:效率太差,没有使用Buffer

    if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
    		    	{
    		           	HttpEntity en=response.getEntity();
    		           	String line = null;
    		           	StringBuffer sb = new StringBuffer();
    		           	BufferedReader reader =null;
    		           	if(contentEncoding != null && contentEncoding.equals("gzip"))
    		           	{
    			           	GZIPInputStream  gin = new GZIPInputStream (en.getContent());
    			           	reader=new BufferedReader(new InputStreamReader(gin));
    		           	}
    		           	else
    		           	{
    			           	reader = new BufferedReader(new InputStreamReader(en.getContent()));
    		           	}
    		           	while((line=reader.readLine())!=null)
    		        	{          		
    		        		sb.append(line);
    		        	} 
    		        	line = sb.toString();
    		        	setResponseBody(line);
    		        	en.consumeContent();
    		        	
    		        	/*rxguang,add for perfermence,2010/04/09*/
    		        	sb = null;
    		        	line = null;
    		        	reader = null;
    		        	en = null;
    		    	}
    通过下如下方式解析response是比较好的选择:
    			if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    				// 1.check content encoding type
    				Header encodeHead = response.getFirstHeader("Content-Encoding");
    				if (encodeHead != null) {
    					contentEncoding = encodeHead.getValue().trim();
    				}
    				// 2.get http response content
    				ByteArrayBuffer byteBuffer = new ByteArrayBuffer(BYTELENGTH);
    				BufferedInputStream bis = null;
    				InputStream is = null;
    				byte[] contentByte;
    				int byteReturnSize = 0;
    				try {
    					BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(response.getEntity());
    					is = bufHttpEntity.getContent();
    					bufHttpEntity.consumeContent();// confirm could read the all content
    					// 3.use corresponding encode type to parse the content
    					if (contentEncoding != null && contentEncoding.equals("gzip")) {
    						GZIPInputStream gin = new GZIPInputStream(is);
    						bis = new BufferedInputStream(gin);
    					} else {
    						bis = new BufferedInputStream(is);
    					}
    					contentByte = new byte[BYTELENGTH];
    					while ((byteReturnSize = bis.read(contentByte, 0, contentByte.length)) >= 0) {
    						byteBuffer.append(contentByte, 0, byteReturnSize);
    					}
    					xmlBody = new String(byteBuffer.toByteArray());
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    				finally {
    					try {
    						if (bis != null)
    							bis.close();
    						if (is != null)
    							is.close();
    					} catch (Exception e2) {
    						e2.printStackTrace();
    					}
    				}
    			}
    
    
    
  • 相关阅读:
    spring 配置 线程池并使用 springtest 进行测试
    Mybatis使用generator自动生成的Example类使用OR条件查询
    springtest mapper注入失败问题解决 {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 解决方案
    idea 开启 tomcat 访问日志记录
    idea ssm项目迁移到另一台机器上时出现不能正常启动项目的解决方案
    记一次 java 连接 linux ssh服务 权限验证失败的原因和解决过程
    ajax传递数组给controller的实现方法和坑
    service手动实例化(new)导致类中的spring对象无法注入的问题解决
    javaweb学习总结十一(JAXP对XML文档进行DOM解析)
  • 原文地址:https://www.cnblogs.com/budoudou/p/2105243.html
Copyright © 2011-2022 走看看