在看??郭霖的《第一行代碼》 時,看到了一個不明白的地方。下面是書中的內容:<--------------------------------分割-------------------------------------->通常情況下我們都應該將這些通用的網絡操作提取到一個公共的類里,并提供一個靜態方法,當想要發起網絡請求的時候只需簡單地調用一下這個方法即可。比如下面的寫法:package com.jack.networktest;????import java.io.BufferedReader;??import java.io.InputStream;??import java.io.InputStreamReader;??import java.net.HttpURLConnection;??import java.net.URL;????public class HttpUtil {????? ? public static String sendHttpRequest(String address){??? ?? ???HttpURLConnection connection=null;??? ?? ???try{??? ?? ?? ?? ?URL url=new URL(address);??? ?? ?? ?? ?connection = (HttpURLConnection) url.openConnection();??? ?? ?? ?? ?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 response.toString();??? ?? ???}catch(Exception e){??? ?? ?? ?? ?e.printStackTrace();??? ?? ?? ?? ?return e.getMessage();??? ?? ???}finally{??? ?? ?? ?? ?if(connection!=null){??? ?? ?? ?? ?? ? connection.disconnect();??? ?? ?? ?? ?}??? ?? ???}??? ? }??} ?以后每當要發起一條HTTP請求的時候就可以這樣寫:??String address="http://www.baidu.com";??String response=HttpUtil.sendHttpRequest(address);? ?? ?? ?在獲取到服務器響應的數據后我們就可以對它進行解析和處理了。但是需要注意,網絡請求通常都是屬于耗時操作,而 sendHttpRequest方法的內部并沒有開啟線程,這樣就可能導致在調用sendHttpRequest方法的時候使得主線程阻塞住。你可能說,在sendHttpRequest方法內部開啟一個線程不就解決了阻塞這個問題了嘛。其實沒那么簡單,因為如果我們在sendHttpRequest方法中開啟了一個線程來發起HTTP請求,那么服務器響應的數據是無法進行返回的,所有的耗時邏輯都是在子線程里進行的,sendHttpRequest方法會在服務器還來得及響應的時候就執行結束了,當然也就無法返回響應的數據了。<--------------------------------分割-------------------------------------->那么問題來了:為什么他說在sendHttpRequest中開啟一個線程發起HTTP請求,數據是無法返回的??? 文章中的解釋有點搞不懂。 ?
添加回答
舉報
0/150
提交
取消