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分別寫的兩個實例完成。