1. 程式人生 > >Okhttp3.0同步與非同步方法使用區別,同時需要注意一些細節問題

Okhttp3.0同步與非同步方法使用區別,同時需要注意一些細節問題

一、Okhttp3.0 execute
這是同步請求。對於同步請求在請求時需要開啟子執行緒,請求成功後需要跳轉到UI執行緒修改UI。

new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                OkHttpClient client = new OkHttpClient();//建立OkHttpClient物件
                Request request = new Request.Builder()
                        .url("http://www.baidu.com"
)//請求介面。如果需要傳參拼接到介面後面。 .build();//建立Request 物件 Response response = null; response = client.newCall(request).execute();//得到Response 物件 if (response.isSuccessful()) { Log.d("kwwl","response.code()=="+response.code()); Log.d("kwwl"
,"response.message()=="+response.message()); Log.d("kwwl","res=="+response.body().string()); //此時的程式碼執行在子執行緒,修改UI的操作請使用handler跳轉到UI執行緒。 } } catch (Exception e) { e.printStackTrace(); } }

二、Okhttp3.0 enqueue
這是非同步請求,所以呼叫enqueue則無需再開啟子執行緒,enqueue方法會自動將網路請求部分放入子執行緒中執行。enqueue回撥方法onResponse與onFailure都執行在子執行緒中,因此onResponse與onFailure中可以用runOnUiThread(new Runnable() {})來執行更新ui的操作。response.body().string()只能呼叫一次,在第一次時有返回值,第二次再呼叫時將會返回null,而且response.body().string()方法必須放在子執行緒中。當執行這行程式碼得到結果後,再跳轉到UI執行緒修改UI。
··············································································································································
注意事項:
1,回撥介面的onFailure方法和onResponse執行在子執行緒。
注意事項:
2,Response.code是http響應行中的code,如果訪問成功則返回200.這個不是伺服器設定的,而是http協議中自帶的。res中的code才是伺服器設定的。注意二者的區別。
3,response.body().string()本質是輸入流的讀操作,所以它還是網路請求的一部分,所以這行程式碼必須放在子執行緒。
4,response.body().string()只能呼叫一次,在第一次時有返回值,第二次再呼叫時將會返回null。原因是:response.body().string()的本質是輸入流的讀操作,必須有伺服器的輸出流的寫操作時客戶端的讀操作才能得到資料。而伺服器的寫操作只執行一次,所以客戶端的讀操作也只能執行一次,第二次將返回null。
5,再次強調,response.body().string()方法必須放在子執行緒中。當執行這行程式碼得到結果後,再跳轉到UI執行緒修改UI。

OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url("http://www.baidu.com")
            .build();
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if(response.isSuccessful()){//回撥的方法執行在子執行緒。
                Log.d("kwwl","獲取資料成功了");
                Log.d("kwwl","response.code()=="+response.code());
                Log.d("kwwl","response.body().string()=="+response.body().string());
            }
        }
    });