Android網絡技術之HttpURLConnection及OkHttp簡單實例

Android網絡技術開發需要在AndroidManifest.xml文件中添加網絡權限:

<!-- 添加網絡權限 -->
    <!--<manifest>在這裏添加</manifest>-->
    <uses-permission android:name="android.permission.INTERNET" />

一.HttpURLConnection

實例實現的功能:將百度首頁以文本的形式返回到Android手機模擬器界面。
1.創建UI佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="點擊發送請求(HttpURLConnection)"
        android:id="@+id/Send_request" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/Send_request">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/response_text" />

    </ScrollView>
</RelativeLayout>

2.在Activity裏編寫實現代碼(註釋寫得很詳細

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
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.URL;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private  Button sendRequest;
    private TextView responseText;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sendRequest = findViewById(R.id.Send_request);
        responseText = findViewById(R.id.response_text);

        sendRequest.setOnClickListener(this);
    }


    /**
     * 點擊按鈕調用下面的網絡請求方法
     * @param v
     */
    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.Send_request){
            sendRequestWithHttpUrlConnection();
        }
    }


    /**
     * 網絡請求方法
     */
    private void sendRequestWithHttpUrlConnection(){
        //Android不允許在主線程中進行網絡訪問,所以要另起線程來發起網絡請求
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                /**
                 * BufferedReader的作用:
                 * 讀取字符時會一次讀取若干字符到緩衝區,
                 * 然後逐個返回給程序,
                 * 降低讀取文件的次數。
                 */
                BufferedReader reader = null;
                try{
                    /**
                     * 1.獲取HttpURLConnection實例:
                     * new出一個URL對象,並傳入目標的網絡地址,
                     * 然後調用openConnection()即可。
                     */
                    URL url = new URL("https://www.baidu.com");
                    connection = (HttpURLConnection) url.openConnection();
                    /**
                     * 2.設置HTTP請求所使用的方法:
                     * GET:從服務器獲取數據;
                     * POST:提交數據給服務器。
                     */
                    connection.setRequestMethod("GET");
                    /**
                     * 3.設置連接超時毫秒數
                     */
                    connection.setConnectTimeout(8000);
                    /**
                     * 4.設置讀取超時的毫秒數
                     */
                    connection.setReadTimeout(8000);
                    /**
                     * 5.調用getInputStream()方法獲取服務器返回的輸入流
                     */
                    InputStream in = connection.getInputStream();
                     /**
                     * 6.對輸入流進行讀取
                     */
                    reader = new BufferedReader(new InputStreamReader(in));
                    /**
                     * 7.對讀取的輸入流進行處理
                     */
                    StringBuffer response = new StringBuffer();
                    String line;
                    while ((line = reader.readLine())!=null){
                        response.append(line);
                    }
                    /**
                     * 8.調用顯示文本的方法(自己寫的方法)
                     */
                    showResponse(response.toString());
                }catch (Exception e){
                    e.printStackTrace();
                    }finally {
                        if (null!=reader){
                            try{
                                reader.close();
                            }catch (IOException e){
                                e.printStackTrace();
                            }
                    }
                    if (null!=connection){
                        //關閉HTTP連接
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

    /**
     * 顯示獲取的文本
     * @param response
     */
    private void showResponse(final String response){
        /**
         * 使用UI線程更新UI
         */
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //進行UI操作,將結果顯示到頁面上
                responseText.setText(response);
            }
        });

    }
}

3.模擬器運行結果:
在這裏插入圖片描述

二.OkHttp

說明:
可以用出色的網絡通信庫OkHttp替代原生的HttpURLConnection(替代後代碼量明顯減少):
需要添加依賴:

implementation 'com.squareup.okhttp3:okhttp:3.12.0'

添加依賴方法:
在這裏插入圖片描述

實例實現的功能:將百度首頁以文本的形式返回到Android手機模擬器界面。
1.創建UI佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Main2Activity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="點擊發送請求(OkHttp)"
        android:id="@+id/Send_request" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/Send_request">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/response_text" />

    </ScrollView>
</RelativeLayout>

2.在Activity裏編寫實現代碼(註釋寫得很詳細

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

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Main2Activity extends AppCompatActivity implements View.OnClickListener{

    private Button sendRequest;
    private TextView responseText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        sendRequest = findViewById(R.id.Send_request);
        responseText = findViewById(R.id.response_text);

        sendRequest.setOnClickListener(this);
    }

    /**
     * 點擊按鈕調用下面的網絡請求方法
     * @param v
     */
    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.Send_request){
            sendRequestWithOkHttp();
        }
    }


    /**
     * 網絡請求方法
     */
    private void sendRequestWithOkHttp(){
        //Android不允許在主線程中進行網絡訪問,所以要另起線程來發起網絡請求
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    /**
                     * 1.創建一個OkHttpClient實例。
                     */
                    OkHttpClient client = new OkHttpClient();
                    /**
                     * 2.要發起HTTP請求,所以要創建一個Request對象,
                     * 通過url()方法設置目標網絡地址。
                     */
                    Request request = new Request.Builder().url("http://www.baidu.com").build();
                    /**
                     * 3.調用OkHttpClient的newCall()方法來創建一個Call對象,
                     * 並調用它的execute()方法來發送請求並獲取服務器返回的數據,
                     * 其中Response對象就是服務器返回的數據。
                     */
                    Response response = client.newCall(request).execute();
                    /**
                     *4.使用如下寫法來得到返回的具體內容。
                     */
                    String responseData = response.body().string();
                    /**
                     * 5.調用顯示文本的方法(自己寫的方法)
                     */
                    showResponse(responseData);
                }catch (Exception e){
                    e.printStackTrace();
                }finally {

                }
            }
        }).start();
    }

    /**
     * 顯示獲取的文本
     * @param response
     */
    private void showResponse(final String response){
        /**
         * 使用UI線程更新UI
         */
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //進行UI操作,將結果顯示到頁面上
                responseText.setText(response);
            }
        });

    }
}

3.模擬器運行結果:
在這裏插入圖片描述
至此,用HttpURLConnection及OkHttp分別寫的兩個實例完成。

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