好吧,不多说了,切入主题!
第一次发表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里。方便以后读取.