android 远程下载与pull解析技术
在android的应用开发中,我们常常会在项目开发的过程中遇到这样的需求:开发一个某移动应用客户端。这时,常常要从服务器获取我们所需要的数据。然后实时的显示在我们的客户端。
好吧,不多说了,切入主题!
第一次发表android技术博文,这里说的是基于android 的远程下载机制。与google官方推荐的我们SDK内置的pull解析技术。当然还有SAX,等解析技术。
首先,介绍HTTP GET请求,我们通过HTTP GET 请求便可从指定的服务器端获取相应的数据。如我在项目中与百度公司合作,从百度服务器端获取数据,而response返回包则以xml文件的形式把数据返回给我们。当然,还有的是以html的形式返回给我们。常见在web开发,及J2EE中可以用到。
代码如下:
//注,我们采用GET方式请求数据,POST,等其他方式请大神们自己GOOGLE了解下。随处可见。。。
//远程下载数据通常比较耗时,所以,我们采用异步处理机制去进行下载工作。把
下载服务器数据把在后台处理.
public class DownloadXML extends AsyncTask<String, Void, Void>{
getXML();
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
Log.d(TAG, "onPostExecute---->");
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
Log.d(TAG, "onPreExecute---->");
showLoaderDialog(mContext);
super.onPreExecute();
}
private void showLoaderDialog(Context context){
progressDialog = new ProgressDialog(context);
progressDialog.setTitle(context.getResources().getString(R.string.prompt));
progressDialog.setIcon(R.drawable.icon);
progressDialog.setMessage(context.getResources().getString(R.string.connect_server));
progressDialog.setIndeterminate(false);
progressDialog.setCancelable(true);
progressDialog.setProgress(10);
progressDialog.setMax(100);
progressDialog.show();
}
public void getXML() throws Exception{
OutputStreamWriter writer = null;
//get url and page encode
String path = "http://192.168.1.123/oa/apk/action.apk"
try{
String xml = getXmlContent(path, "UTF-8");
//建立一个文件输出流,准备将得到的字符串存到本地的手机上。
File board_file = new File(Utility.getSDCardPath(), "board.xml");
FileOutputStream outStream = new FileOutputStream(board_file);
//准备写出输出流
if(Environment.getExternalStorageState()==Environment.MEDIA_MOUNTED){
writer = new OutputStreamWriter(outStream);
//将xml字符串写到文件里面去
writer.write(xml);
//写完之后,推出去。用文件浏览器看看有没有保存到文件~~~
Log.i(TAG, xml);
writer.flush();
writer.close();
}
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
showErrorDialog();
}
}
private String getXmlContent(String path, String encoding) throws Exception{
//将字符串形式的path,转换成一个url
URL url = new URL(path);
//得到url之后,将要开始连接网络
//首先,实例化一个HTTP连接对象conn
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//定义请求方式为GET,其中GET的大小写不要搞错了。
conn.setRequestMethod("GET");
//定义请求时间,在ANDROID中最好是不好超过10秒。否则将被系统回收。
conn.setConnectTimeout(6*1000);
//请求成功之后,服务器会返回一个响应码。如果是GET方式请求,服务器返回的响应码是200,
//post请求服务器返回的响应码是206(貌似)。
Log.d(TAG,"THE CODE == "+conn.getResponseCode());
if(conn.getResponseCode()==200){
//从服务器传递过来数据,是一个输入的动作。定义一个输入流,获取从服务器返回的数据
InputStream input = conn.getInputStream();
//得到输入流的数据之后,调用readStream方法对输入流进行处理。返回的一个字节数组。
byte[] data = readStream(input);
Log.d(TAG,"the data= "+new String(data,encoding));
return new String(data,encoding);
}
return null;
}
public byte[] readStream(InputStream inStream) throws Exception{
//readStream获得了传递进来的输入流
//要返回输入流,就需要定义一个输出流。
//定义一个字节数组型的输出流,ByteArrayOutputStream
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//建立一个缓冲区buffer
byte[] buffer = new byte[4*1024];
int len= -1;
//将输入流不断的读,并放到缓冲区中去。直到读完
while((len=inStream.read(buffer))!=-1){
//将缓冲区的数据不断的写到内存中去。边读边写
outStream.write(buffer, 0, len);
}
outStream.close();
inStream.close();
//将输出流以字节数组的方式返回
return outStream.toByteArray();
}
再者,讲讲PULL解析技术,在android源码中,我们可以看到一个内置的xml解析器,就是PULL解析,有兴趣的大神们可以去了解一下。与SAX技术,很相近,两者都是通过事件驱动来进行解析的,当走到文档的START_DOCUMENT 时,触发一个事件,回调相应的方法去处理。而PULL则是返回一个整型值。int event=parser.getEventType(); 这个×××值就代表事件类型,也即是文档的TAG标签。
代码如下:
下面以person.xml为解析对象:
<persons>
<person>
<id>1</id>
<name>zhangshang</name>
<sex>男</sex>
<age>22</age>
</person>
<person>
<id>2</id>
<name>李四</name>
<sex>女</sex>
<age>20</age>
</person>
</persons>
public List<Persons> getPersons(InputStream inputStream) throws Throwable
{
List<Persons> persons=null;
Persons person=null;
XmlPullParser parser=Xml.newPullParser();
parser.setInput(inputStream, "utf-8");
int event=parser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT)
{
Log.d(TAG,"the event = "+event);
switch (event)
{
case XmlPullParser.START_DOCUMENT:
persons=new ArrayList<Persons>();
break;
case XmlPullParser.START_TAG:
if("person".equals(parser.getName()))
{
person=new Persons();
Integer id=new Integer(parser.getAttributeValue(0));
person.setId(id);
}
if(person!=null)
{
if("name".equals(parser.getName()))
{
String name=parser.nextText().toString();
person.setName(name);
}
else if("age".equals(parser.getName()))
{
int age=new Integer(parser.nextText().toString());
person.setAge(age);
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName()))
{
persons.add(person);
person=null;
}
break;
default:
break;
}
event=parser.next();
}
return persons;
}
将解析后的数据放入一个List里。方便以后读取.
转载于:https://blog.51cto.com/3982975/721300
android 远程下载与pull解析技术相关推荐
- Qt on Android: http下载与Json解析
百度提供有查询 ip 归属地的开放接口,当你在搜索框中输入一个 ip 地址进行搜索,就会打开由 ip138 提供的百度框应用,你可以在框内直接输入 ip 地址查询.我查看了页面请求,提取出查询 ip ...
- 在Android应用中使用Pull解析XML文件(传智播客视频笔记)
Service.java源码: package com.sinaapp.ssun.service; import java.io.InputStream; import java.io.OutputS ...
- Android之Pull解析XML
一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...
- Android实现XML解析技术 (转载http://www.cnblogs.com/hanyonglu/archive/2012/02/28/2370675.html)...
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
- Android学习笔记---15_采用Pull解析器解析和生成XML内容
15_采用Pull解析器解析和生成XML内容 -------------------------------------- 使用SAX或者DOM或者pull解析XML文件 -------------- ...
- Android实现XML解析技术
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
- :Android网络编程--XML之解析方式:SAX
任何放置在资源(res)目录下的内容可以通过应用程序的R类访问,这是被Android编译过的,而任何放置在资产(assets)目录下的内容会保持它的原始文件格式,为了读取它们,必须使用AssetMan ...
- XML解析:PULL解析
为什么80%的码农都做不了架构师?>>> 概述: PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用 ...
- xml解析:Sax,Dom,pull解析
Sax 1.startDocument()文档开始 2.endDocument()文档结束 3.startElement(String namespaceURI,String localName,St ...
最新文章
- whereis, which, locate的区别
- ntu ERIC 课程笔记
- 12、索引在什么情况下不会被使用?
- 全球首个开放应用模型 OAM 开源 | 云原生生态周报 Vol. 23
- python 写入第二列_python读写Excel表格的实例代码(简单实用)
- 8.16模拟:树上算法
- hibernate连接数据库配置
- 【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式队列
- Java基础(二)——面向对象
- oracle应用程序开发,关于Oracle 数据库应用程序开发问题
- HashMap和HashSet的区别?
- Everybody was kung-fu fighting
- 利用VS2005进行dump文件调试
- 快速排序之螺钉螺母匹配
- bt服务器搭建 linux_linux系统架设BT服务器的详细教程
- java工程师面试题大全-100%公司笔试题你都能碰到几个
- 蓬莱与威海的几尊塑像
- Web全栈开发基础(小白入门版本)
- oracle11g-R2数据库的逻辑备份(数据泵的导入导出)
- Yotta企业云盘:怎样让企业数据文档防泄密