初識Android網絡連接HttpURLConnection

在Android 6.0以後,官方建議的處理網絡請求的方式是HttpURLConnection,而HTTPClient已經被廢棄。下面我們就瞭解一下HttpURLConnection的基本實現方法。

首先創建httpconnectiondemo,先寫一個能夠展示請求到的數據的xml佈局:activity_main。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.wang.httpconnectiondemo.MainActivity">

    <TextView
        android:id="@+id/tvResponse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:background="#aa33ff"
        android:padding="24dip"
        android:textColor="#ffffff"
        android:textSize="16sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

這個簡單的佈局可以展示服務器響應的數據。

其次,要在清單文件的manifest節點下,添加用戶權限:

<uses-permission android:name="android.permission.INTERNET"/>

然後在MainActivity 中完成網絡請求的業務邏輯。

1 給控件tvResponse設置一個點擊事件,觸發網絡請求。

2 在方法requestServerData()中發送請求:

首先創建一個子線程,來處理網絡請求這個耗時操作,在這個子線程中創建HttpURLConnection對象,設置請求的各項屬性。

3 將讀取的數據展示在佈局的控件 tvResponse中。

注意事項:請求完成後,要關閉HttpURLConnection對象:

connection.disconnect()


package com.wang.httpconnectiondemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    public static String URL_ADDR = "https://www.baidu.com/";
    private static final String TAG = "MainActivity";
    private TextView tvResponse;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvResponse = findViewById(R.id.tvResponse);
        tvResponse.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                requestServerData();
            }
        });
    }
    private void requestServerData() {

        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                BufferedReader reader = null;
                try {
                    URL url = new URL(URL_ADDR);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(3000);
                    connection.setReadTimeout(3000);
                    InputStream inputStream = connection.getInputStream();
                    //讀取輸入流
                     reader = new BufferedReader(new InputStreamReader(inputStream));
                    //
                    StringBuilder builder = new StringBuilder();
                    String lens;
                    while ((lens = reader.readLine()) != null) {
                        builder.append(lens);
                    }
                    //將讀取的數據展示在佈局中
                    showResponse(builder.toString());

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

    private void showResponse(final String string) {
        Log.i(TAG, "showResponse:------ "+ string);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvResponse.setText(string);
            }
        });
    }
}

在這個demo中,創建了一個子線程來處理網絡請求,爲了便於管理線程,在優化過程中可以使用線程池來管理線程。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章