Android学习(九)初学网络技术
网络开发
现在大部分app都会包含网络开发,网络开发可以极大丰富内容。这里只是一些基本的网络开发技术学习。
HTTP开发 HttpURLConnection
这里我们使用的是HttpURLConnection进行HTTP开发。
- 创建一个URL对象,指定访问地址
URL url = new URL("https://www.baidu.com/");
- 获取HttpURLConnection对象实例,进行自定义配置
HttpURLConnection httpURLConnection = null;
...
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET"); //请求类型
httpURLConnection.setConnectTimeout(5000); //连接超时
httpURLConnection.setReadTimeout(5000); //读取超时
- 调用getInputStream()获取网络返回的输入流
获取输入流后,可以对数据进行赌气
InputStream inputStream = httpURLConnection.getInputStream();
...
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer data = new StringBuffer();
String flag;
while ((flag = bufferedReader.readLine()) != null) {
data.append(flag);
}
- 最后调用disconnect()关闭连接
httpURLConnection.disconnect(); //关闭连接
完整代码
BufferedReader bufferedReader = null;
try {
URL url = new URL("https://www.baidu.com/");
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET"); //请求类型
httpURLConnection.setConnectTimeout(5000); //连接超时
httpURLConnection.setReadTimeout(5000); //读取超时
InputStream inputStream = httpURLConnection.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer data = new StringBuffer();
String flag;
while ((flag = bufferedReader.readLine()) != null) {
data.append(flag);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (httpURLConnection != null) {
httpURLConnection.disconnect(); //关闭连接
}
}
解析网络数据
网络传输比较常用的两种数据格式如下:
XML格式
Pull解析
- 获取XmlPullParser对象实例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
- 通过setInput()方法进行解析
xmlPullParser.setInput(new StringReader(xmlString));
- 采用while循环
调用getEventType(),判断解析进度
通过getName()获取节点名称和nextText()获取节点内容
int eventType = xmlPullParser.getEventType(); //解析事件
while (eventType != XmlPullParser.END_DOCUMENT) {
String dataName = xmlPullParser.getName(); //节点名称
switch (eventType) {
case XmlPullParser.START_TAG:
//处理开始解析的逻辑
String data = xmlPullParser.nextText(); //节点内容
break;
case XmlPullParser.END_TAG:
//某个节点解析完成
break;
default:
break;
}
eventType = xmlPullParser.next();
}
完整代码
private void parsePull(String xmlString) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
int eventType = xmlPullParser.getEventType(); //解析事件
while (eventType != XmlPullParser.END_DOCUMENT) {
String dataName = xmlPullParser.getName(); //节点名称
switch (eventType) {
case XmlPullParser.START_TAG:
//处理开始解析的逻辑
String data = xmlPullParser.nextText(); //节点内容
break;
case XmlPullParser.END_TAG:
//某个节点解析完成
break;
default:
break;
}
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
SAX解析
- 创建一个类继承
package com.example.testapplication;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class TestHandle extends DefaultHandler {
private String flag;
private StringBuffer data;
@Override
public void startDocument() throws SAXException {
//开始解析时,逻辑处理
data = new StringBuffer();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
flag = localName; //记录节点名称
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//如果节点名称匹配,存入数据
data.append(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
//节点解析结束时,逻辑处理
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
// 全部解析解析时,逻辑处理
}
}
- 代码进行解析
private void parseSAX(String xmlString) {
try {
//获取XMLReader对象
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
//配置内容事件处理的handle
TestHandle handle = new TestHandle();
xmlReader.setContentHandler(handle);
//获取InputSource,进行解析
StringReader stringReader = new StringReader(xmlString);
InputSource inputSource = new InputSource(stringReader);
xmlReader.parse(inputSource);
} catch (Exception e) {
e.printStackTrace();
}
}
JSON格式
JSON格式下的数据,体积更小,但不如XML直观。
JSONObject
- 获取JSONObject
- 读取数据
例如
private void parseJSONObject (String jsonString) {
try {
JSONObject jsonObject = new JSONObject(jsonString);
String data = jsonObject.getString("test");
} catch (JSONException e) {
e.printStackTrace();
}
}
GSON
该方法由谷歌提供,使用起来更加方便快捷。
我们可以直接把数据转换成对象取出。
- 根据数据格式,创建对象
package com.example.testapplication;
public class Test {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Test(String name, int age) {
this.name = name;
this.age = age;
}
}
- 解析
private void parseGson(String jsonString) {
Test test = new Gson().fromJson(jsonString, Test.class);
}