Android學習(九)初學網絡技術

網絡開發

現在大部分app都會包含網絡開發,網絡開發可以極大豐富內容。這裏只是一些基本的網絡開發技術學習。

HTTP開發 HttpURLConnection

這裏我們使用的是HttpURLConnection進行HTTP開發。

  1. 創建一個URL對象,指定訪問地址
URL url = new URL("https://www.baidu.com/");
  1. 獲取HttpURLConnection對象實例,進行自定義配置
HttpURLConnection httpURLConnection = null;
...
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");  //請求類型
httpURLConnection.setConnectTimeout(5000);  //連接超時
httpURLConnection.setReadTimeout(5000); //讀取超時
  1. 調用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);
}

  1. 最後調用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解析

  1. 獲取XmlPullParser對象實例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
  1. 通過setInput()方法進行解析
xmlPullParser.setInput(new StringReader(xmlString));
  1. 採用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解析

  1. 創建一個類繼承
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();
        // 全部解析解析時,邏輯處理
    }

}
  1. 代碼進行解析
    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

  1. 獲取JSONObject
  2. 讀取數據

例如

    private void parseJSONObject (String jsonString) {
        try {
            JSONObject jsonObject = new JSONObject(jsonString);
            String data = jsonObject.getString("test");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

GSON

該方法由谷歌提供,使用起來更加方便快捷。
我們可以直接把數據轉換成對象取出。

  1. 根據數據格式,創建對象
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;
    }
}

  1. 解析
    private void parseGson(String jsonString) {
        Test test = new Gson().fromJson(jsonString, Test.class);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章