使用HttpURIConnection和OkHttp訪問網(wǎng)絡(luò)

NetworkTest

看精彩的世界——————使用網(wǎng)絡(luò)技術(shù)

使用HttpURIConnection訪問網(wǎng)絡(luò)

 private void sendRequestWithHttpURIConnection() {
//        開啟線程發(fā)起網(wǎng)絡(luò)請求
    new Thread(new Runnable() {
        @Override
        public void run() {
            HttpURLConnection connection = null;
            BufferedReader reader = null;
            try{

                URL url = new URL("http://www.baidu.com");
                connection = (HttpURLConnection) url.openConnection();

        //GET表示希望從服務(wù)器哪里獲取數(shù)據(jù)
                connection.setRequestMethod("GET");

        //設(shè)置連接超時(shí),讀取超時(shí)的毫秒數(shù)
                connection.setConnectTimeout(8000);
                connection.setReadTimeout(8000);

        //調(diào)用getInputStream()方法就可以得到服務(wù)器返回的輸入流了
                InputStream in = connection.getInputStream();
//                    下面對獲取到的輸入流進(jìn)行讀取
                reader = new BufferedReader(new InputStreamReader(in));
                StringBuilder response = new StringBuilder();
        //下面是設(shè)置行的個(gè)數(shù),以便顯示所有數(shù)據(jù)
                String line;
                while ((line = reader.readLine()) != null){
                    response.append(line);
                }
                showResponse(response.toString());
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                if (reader != null){
                    try{
                        reader.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
                if (connection != null){
                    connection.disconnect();
                }
            }
        }
    }).start();
}</pre>

使用OkHttp 訪問網(wǎng)絡(luò)

  • 先在安裝的Apache服務(wù)器的C:/Apache/htdocs目錄下新建一個(gè)get_data.xml文件,文件內(nèi)容:
    <apps>
        <app>
            <id>1</id>
            <name>Google Maps</name>
            <version>1.0</version&gt
        </app>

        <app>
        <id>2</id>
        <name>Chrome</name>
        <version>2.1</version>
        </app>

        <app
        <id>3</id>
        <name>Google Play</name>
        <version>2.3</version>
        </app>
    </apps>
  • 接下來就是訪問的主題代碼:
    private void sendRequestWithOkhttp() {
            new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder()
//                            訪問地址為baidu的地址
//                            .url("http://www.baidu.com")
//                            指定訪問的服務(wù)器地址是電腦本機(jī)
                            .url("http://10.0.0.2/get_data.xml")
                            .build();
                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();

//                    showResponse(responseData);

//                    Pull的解析方式
//                    parseXMLWithPull(responseData);
//
//                    SAX的解析方式
                    parseXMLWithSAX(responseData);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }</pre>

解析XML格式的數(shù)據(jù)

  • Pull的解析方式
  • SAX的解析方式

* Pull的解析方式

 private void parseXMLWithPull(String xmlData) {
        try{
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();
            xmlPullParser.setInput(new StringReader(xmlData));
            int eventType = xmlPullParser.getEventType();
            String id = "";
            String name = "";
            String version = "";
            while (eventType == xmlPullParser.END_DOCUMENT){
                String nodeName = xmlPullParser.getName();
                switch(eventType){
//                    開始解析摸個(gè)節(jié)點(diǎn)
                    case XmlPullParser.START_TAG:{
                        if ("id".equals(nodeName)){
                            id = xmlPullParser.nextText();
                        }else if ("name".equals(nodeName)){
                            name = xmlPullParser.nextText();
                        }else if ("version".equals(nodeName)){
                            version = xmlPullParser.nextText();
                        }
                        break;
                    }
//                    完成解析某個(gè)節(jié)點(diǎn)
                    case XmlPullParser.END_TAG:{
                        if ("app".equals(nodeName)){
                            Log.d("MainActivity","id id " + id);
                            Log.d("MainActivity","name is " + name);
                            Log.d("MainActivity","version is " + version);
                        }
                        break;
                    }
                    default:
                        break;
                }
                eventType = xmlPullParser.next();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
</pre>

SAX的解析方式

首先需要建立一個(gè)類繼承DefaulyHander,并重寫父類的5個(gè)方法

public class ContentHander extends DefaultHandler{

}

public void startDocument() throws SAXException {

}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

}

public void characters(char[] ch, int start, int length) throws SAXException {

}

public void endElement(String uri, String localName, String qName) throws SAXException {

}

public void endDocument() throws SAXException {

}

再在MainActivity里面做如下修改:

private void parseXMLWithSAX(String xmlData) {

        try{
            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            ContentHander hander = new ContentHander();
//            將ContentHander的實(shí)例設(shè)置到XMLReader中
            xmlReader.setContentHandler(hander);
//            開始執(zhí)行解析
            xmlReader.parse(new InputSource(new StringReader(xmlData)));
        }catch (Exception e){
            e.printStackTrace();
        }
    }</pre>

解析JSON格式的數(shù)據(jù)

  • 使用JSONObject
  • 使用GSON

使用JSONObject

  • 先在安裝的Apache服務(wù)器的C:/Apache/htdocs目錄下新建一個(gè)get_data.json文件,文件內(nèi)容:
[{"id":"5","version":"5.5","name":"Clash of Clans"},
{"id":"6","version":"7.0","name":"Boom Beach"},
{"id":"7","version":"3.5","name":"Clash Royale"}]</pre>

下面是具體的JSONObject解析方式

    ////         JSONObject的解析方式
    private void parseJSONObject(String jsonData) {
        try{
            JSONArray jsonArray = new JSONArray(jsonData);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String id = jsonObject.getString("id");
                String name = jsonObject.getString("name");
                String version = jsonObject.getString("version");
                Log.d("MainActivity","id id " + id);
                Log.d("MainActivity","name is" + name);
                Log.d("MainActivity","version is " + version);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }</pre>

下面是具體的GSON解析方式

  • 首先新建一個(gè)AppK類,加入id,name,version這幾個(gè)字段,并寫入getter,setter方法

接著就是解析的方法了:

private void parseJSONWithGSON(String jsonData) {
        Gson gson = new Gson();
        List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>()
        {}.getType());
        for (App app : appList){
            Log.d("MainActivity","id is " + app.getId());
            Log.d("MainActivity","name is " + app.getName());
            Log.d("MainActivity","version is " + app.getVersion());
        }
    }</pre>

當(dāng)然,以上的方法是有問題的,如果我們每次都去編寫一變發(fā)送HTTP請求的代碼,這顯然是費(fèi)勁的,我們可以把這些通用的網(wǎng)絡(luò)操作提到一個(gè)公共類中,但是不能每次都調(diào)用都寫一個(gè)線程,因?yàn)榉椒〞?huì)在服務(wù)器還沒來得及響應(yīng)的時(shí)候就執(zhí)行結(jié)束了,因此我們

需要先定義一個(gè)接口

public interface HttpCallbackListener{
    void onFinish(String response);

    void onError(Exception e);
}</pre>

接著寫HttpUtil類中的添加方法:

public static void sendHttpRequest(final String address,final HttpCallbackListener listener){
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try{
                    URL url = new URL(address);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
                    InputStream in = connection.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder respond = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null){
                        respond.append(line);
                    }
                    if (listener != null){
//                        調(diào)回onFinish()方法
                        listener.onFinish(respond.toString());
                    }
                }catch (Exception e){
                    if (listener != null){
//                        回調(diào)onError()方法
                        listener.onFinish(e);
                    }
                }finally {
                    if (connection != null){
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }</pre>

HttpUtilConnection的寫法總體上來說比較復(fù)雜,那么使用OkHttp會(huì)變簡單嗎,答案是肯定的

public static void sendOkHttpRequest(String address,okhttp3.Callback callback){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(address)
                .build();
        client.newCall(request).enqueue(callback);
    }</pre>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,753評論 25 709
  • 本篇文章主要介紹以幾下個(gè)知識點(diǎn):使用 HTTP 協(xié)議訪問網(wǎng)絡(luò):使用 HttpURLConnection 和 OKH...
    開心wonderful閱讀 1,527評論 0 3
  • 昨天寫了關(guān)于憤怒的情緒。坦白說,我是不允許自己憤怒的。也許在朋友同事眼里,我是語氣柔和,脾氣很好的人,從來不會(huì)發(fā)脾...
    綻蕊向陽閱讀 304評論 1 2
  • 處學(xué)校期間,在上課之外就是備考心理咨詢師三級證書、練練筆以及閱讀之類,而上一周終于有得機(jī)會(huì)許我返家放松,然而...
    老君眉好吃閱讀 381評論 0 1
  • 快樂是我們每一個(gè)人所追求的。我們也喜歡也愿意與快樂的人相處與交往,因?yàn)榭鞓肥强梢詡魅竞透惺艿?,也能夠提升我們?..
    苦行果閱讀 1,971評論 1 2

友情鏈接更多精彩內(nèi)容