Android網路請求(1)

2022-11-22 06:00:51

Android網路請求(1)

​ 安卓開發網路請求可謂是安卓開發的靈魂,如果你不會網路請求,那麼你開發的應用軟體就是一具沒有靈魂的枯骨。

​ 在安卓開發中進行網路請求和java中的網路請求有異曲同工之妙,但是安卓軟體畢竟的安裝在我們手機上的,而平常的應用軟體下載後會要求你給與許可權,否則就沒辦法使用,網路請求也需要對應的許可權,否則就沒法進行聯網操作。

​ 首先在AndroidManifest.xml檔案中新增網路請求許可權。要在manifest標籤內,application標籤外新增

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

​ 新建java檔案,建立靜態方法,返回請求後的結果

package com.example.smartcity.Net;
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 Internet {
    public static String get(String src){
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        StringBuilder response = null;
        try{
            URL url = new URL(src);//新建URL
            connection = (HttpURLConnection)url.openConnection();//發起網路請求
            connection.setRequestMethod("GET");//請求方式
            connection.setConnectTimeout(8000);//連線最大時間
            connection.setReadTimeout(8000);//讀取最大時間
            InputStream in = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(in));//寫入reader
            response = new StringBuilder();
            String line;
            while((line = reader.readLine()) != null){
                response.append(line);
            }
        }catch (Exception e){//異常丟擲
            e.printStackTrace();
        }finally {
            if(reader != null){
                try{
                    reader.close();//io流開了要關,不然容易記憶體洩露
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if(connection != null){
                connection.disconnect();//同理,關閉http連線
            }
        }
        return response.toString();
    }
}

​ 我們寫好了一個最基本的不帶任何框架的網路請求方法,該方法支援不帶Header的get請求,能夠通過get方法獲取到我們想要的資料,這裡responese是StringBuffer類是因為在獲取到了BufferedReader後,要通過while迴圈將資料寫入String中,StringBuffer類對比String類來說更適合進行這種頻繁寫入的操作。

​ 接下來讓我們去使用我們的這個方法進行一個最基本的網路請求吧,我們通過get方法請求一下百度的網址看看他會返回什麼給我們。

​ 在MainActivity的onCreate方法中進行網路請求

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String s = Internet.get("https://www.baidu.com");
        System.out.println(s);
    }

​ 是不是以為這就結束了?錯!

​ 安卓開發中網路請求操作是一種耗時操作,安卓中不允許在主執行緒中進行網路請求操作,java程式碼的執行規律是自上而下,一旦中途發生網路請求這種耗時操作,單反你網路卡一點,或者沒有網路,那麼下面的程式碼都會被卡死,無法執行,容易造成執行緒堵塞,就像堵車一樣。所以我們要例外開一條路疏通車流,這就是子執行緒。

​ 我們的網路請求需要在子執行緒中去進行,在安卓開發中開啟子執行緒非常的簡單,無需為了這個執行緒新建一個方法或類。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       new Thread(new Runnable() {
            @Override
            public void run() {
                String s = Internet.get("https://www.baidu.com");
                System.out.println(s);
            }
        }).start();

    }

​ 那麼我們看看能拿到什麼東西吧

​ 我們看到,我們成功拿到了百度首頁的html資料,這邊我們也可以在瀏覽器上開啟百度,然後f12檢視是一樣的。

​ 相信你們試驗一下,會發現有時會爆出錯誤資訊

Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted

​ 這是因為android自2019年11月1日起不在執行http請求。那麼我們要怎樣去解決這個問題呢

​ 1、降低sdk版本

​ 在build.gradle(app)中修改targetSdkVersion和minSdkVersion為26,這是安卓8.0對應的sdk版本

​ 2、設定network-security-config

​ 在AndroidManifest.xml檔案的application標籤中新增一行

android:networkSecurityConfig="@xml/network"

​ 在res檔案下新建xml資料夾,然後新建network.xml檔案,將如下程式碼貼上至檔案內,該檔案內只保留下列程式碼即可

<?xml version="1.0" encoding="utf-8"?>
<!--Android 9.0 http請求適配-->
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

獲取到網路資料後修改ui檢視

​ 相信不少同學在獲取到資料後就想去嘗試將textview或者其他的元件中的text修改成自己拿到的資料吧。

​ 在修改前,我們要注意些問題:首先,安卓開發中你無法在子執行緒中操作ui,否則會爆出Only the original thread that created a view hierarchy can touch its views.錯誤,那麼我們該怎麼去修改檢視呢。

​ 答案很簡單,android的Activity類給了我們這個一個方法runOnUiThread方法,它能夠在子執行緒中去修改ui檢視,它的使用也很簡單

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        button.setText(s);//修改檢視
    }
});

​ 那麼,我們得出最終的程式碼

new Thread(new Runnable() {
    @Override
    public void run() {
        String s = Internet.get("http://www.baidu.com");
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                button.setTag(s);
            }
        });
        System.out.println(s);
    }
}).start();

這樣就可以實現最簡單的網路請求修改資料了。