在看 郭霖的《第一行代码》 时,看到了一个不明白的地方。下面是书中的内容:
<--------------------------------分割-------------------------------------->
通常情况下我们都应该将这些通用的网络操作提取到一个公共的类里,并提供一个静态方法,当想要发起网络请求的时候只需简单地调用一下这个方法即可。比如下面的写法:
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请求,数据是无法返回的??? 文章中的解释有点搞不懂。