在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中,創建了一個子線程來處理網絡請求,爲了便於管理線程,在優化過程中可以使用線程池來管理線程。