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);
}