Android——網絡操作基礎

在Android app中,網絡操作是不可或缺的一個模塊,手機中數據的上傳下載都需要通過app中的網絡操作模塊進行。

在Android進行http請求操作有多種方式,在這裏我簡單說一下最基礎的用HttpURLConnection進行網絡操作的方法

一、向設備申請網絡權限

首先需要向設備申請網絡權限。

如果是Android9.0以前版本的設備,只需要在AndroidManifest.xml文件中添加一個與<application>同級的標籤即可

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

 從Android9.0開始增加了對http請求的限制,在添加上面的標籤之後,還需要我們另外創建安全配置文件

1、在res文件夾下創建xml/network-security-config.xml文件

2、在netnetwork-security-config.xml中添加cleartextTrafficPermitted屬性

xml文件內容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true"/>
</network-security-config>

3、指定安全配置文件

在AndroidManifest中的Application標籤裏申明配置文件

android:networkSecurityConfig="@xml/network_security_config"

二、在Activity中進行http請求

首先在mainlayout中創建一個id爲myclick的Button。

然後是在Activity中的操作:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainlayout);
    }
        public void get() {
            try {
                //實例化URL對象
                URL url = new URL("http://www.imooc.com/api/teacher?type=3&cid=1");

                //獲取HTTPURLConnection實例
                HttpURLConnection httpconn = (HttpURLConnection)url.openConnection();

                //設置請求相關屬性
                //設置方式
                httpconn.setRequestMethod("GET");
                //設置請求時長
                httpconn.setConnectTimeout(5000);
                //獲取響應碼     200:成功   404:未請求到指定資源  500:服務器異常
                if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    InputStream in = httpconn.getInputStream();
                    byte[] b = new byte[1024];
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    int length = 0;
                    while ((length = in.read(b)) > -1) {
                        //不能不做判斷直接in.read(b),因爲若數據讀完了,輸入流還會繼續讀,只是內容爲空,這時循環會繼續。
                        // 而當in.read()取值爲-1時則代表已經沒有內容了
                        baos.write(b, 0,length);
                    }
                    String str = new String(baos.toString());
                    Log.i("MainActivity", str + "----------------");
                };
            }
            catch (MalformedURLException e1) {
                e1.printStackTrace();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }

    public void myclick(View view) {
        switch(view.getId()) {
            case R.id.get:
                new Thread() {
                    @Override
                    public void run() {
                        super.run();
                        get();
                    }
                }.start();
            break;
        }
    }
}

在做好前面兩步後安裝apk到設備中,點擊按鈕即可在AS中的Logcat中查看獲取到的信息。

三、可能遇到的報錯

在這裏簡單列舉在網絡操作中可能遇到的一些報錯情況:

1、NetworkOnMainThreadException

如果遇到NetworkOnMainThreadException報錯的,則說明網絡請求操作在主線程中進行了,我們需要開一個子線程進行網絡請求

如前面我給出的例子,則是將get()操作放在子線程中進行:

public void myclick(View view) {
        switch(view.getId()) {
            case R.id.get:
                new Thread() {
                    @Override
                    public void run() {
                        super.run();
                        get();
                    }
                }.start();
            break;
        }
    }

 

2、SecurityException

遇到java.lang.SecurityException: Permission denied (missing INTERNET permission?)

這種報錯的一般是沒有在AndroidManifest中申請網絡權限

解決辦法:在AndroidManifest文件中<application>標籤外添加網絡權限申請標籤:

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

 

3、NetworkSecurityConfig

遇到這種報錯是因爲在Android9.0後面的版本增加了對http請求的限制,需要我們另外創建安全配置文件:

1)在res文件夾下創建xml/network_security_config.xml文件

2)在network_security_config.xml文件中添加cleartextTrafficPermitted屬性

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true"/>
</network-security-config>

3)指定安全配置文件

在AndroidManifest.xml中的Application添加申明(引用剛纔創建的安全配置文件的地址)

android:networkSecurityConfig="@xml/network_security_config"

 

4、SocketException

這種情況一般爲多次調試程序後出現,如新添加的配置文件沒有安裝進設備,則可能出現這個exception

解決方法:卸載程序後重新安裝運行即可

 

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