Android通用網路操作的封裝:HttpUrlConnection 和 OkHttp [學習筆記]
阿新 • • 發佈:2019-01-24
package com.lfork.a98620.networkbestpractice; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import java.io.IOException; import okhttp3.Call; import okhttp3.Response; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //呼叫HttpConnection封裝的程式碼進行網路請求 HttpUtil.sendHttpRequest("https://www.baidu.com", new HttpCallbackListener() { @Override public void onFinish(String response) { //在這裡根據返回的內容執行具體的邏輯 Log.d(TAG, "onFinish: 返回的內容如下:" + response); } @Override public void onError(Exception e) { //異常處理 Log.d(TAG, "onError: 錯誤資訊如下:" + e); } }); //呼叫OkHttp封裝的程式碼進行網路請求 HttpUtil.sendOkHttpRequest("https://www.baidu.com", new okhttp3.Callback() { @Override public void onFailure(Call call, IOException e) { //異常處理 //錯誤資訊如下 Log.d(TAG, "onFailure: 錯誤資訊如下:" + e); } @Override public void onResponse(Call call, Response response) throws IOException { //得到伺服器返回的neir String responseData = response.body().toString(); Log.d(TAG, "onResponse: 返回的內容如下:" + response); } }); } }
3、HttpUtil.java
package com.lfork.a98620.networkbestpractice; ///** // * Created by 98620 on 2017/8/15. // */ import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import okhttp3.OkHttpClient; import okhttp3.Request; public class HttpUtil { /* 將HttpUrlConnection的網路操作進行封裝 1、程式功能:將通用的網路操作(HttpURLConnection 和 OkHttp)進行封裝 2、子執行緒和回撥機制的使用:網路操作是耗時操作。所以需要開啟一個子執行緒來進行,並且還要使用Java的回撥機制來返回資料 3、GET: 子執行緒是無法通過return語句來返回資料的 */ public static void sendHttpRequest(final String address, final HttpCallbackListener listener) { new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL(address); connection = (HttpURLConnection) url.openConnection(); //GET 表示獲取資料 POST表示傳送資料 connection.setRequestMethod("GET"); //設定連線超時的時間 connection.setConnectTimeout(8000); connection.setReadTimeout(8000); connection.setDoInput(true); connection.setDoOutput(true); InputStream in = connection.getInputStream(); //下面對獲取到的輸入流進行讀取 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } /*子執行緒是無法通過return語句來返回資料的,並且這裡的返回值也設定為空了 所以這裡需要把資料傳入到HttpCallbackListener的OnFinish()方法中 */ if (listener != null) { //回撥Onfinish方法 listener.onFinish(response.toString()); } } catch (Exception e) { if (listener != null) { listener.onError(e); } } finally { if (connection != null) { connection.disconnect(); } } } }).start(); } /* 將OkHttp進行封裝 只有3行...... */ public static void sendOkHttpRequest(String address, okhttp3.Callback callback) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url(address).build(); client.newCall(request).enqueue(callback); } }