封装一个HttpUtil请求帮助类
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}Code language: PHP (php)
public class HttpUtil {
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();
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);
}
if (listener != null) {
// 回调onFinish()方法
listener.onFinish(response.toString());
}
} catch (Exception e) {
if (listener != null) {
// 回调onError()方法
listener.onError(e);
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
}Code language: PHP (php)
我们首先给sendHttpRequest() 方法添加了一个HttpCallbackListener 参数, 并在方法的内部开启了一个子线程, 然后在子线程里去执行具体的网络操作。 注意, 子线程中是无法通过return 语句来返回数据的, 因此这里我们将服务器响应的数据传入了HttpCallbackListener的onFinish() 方法中, 如果出现了异常就将异常原因传入到onError() 方法中。
现在sendHttpRequest() 方法接收两个参数了, 因此我们在调用它的时候还需要将HttpCallbackListener的实例传入, 如下所示:
HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {
@Override
public void onFinish(String response) {
// 在这里根据返回内容执行具体的逻辑
}
@Override
public void onError(Exception e) {
// 在这里对异常情况进行处理
}
});Code language: JavaScript (javascript)
那么使用OkHttp会变得简单吗? 答案是肯定的, 而且要简单得多, 下面我们来具体看一下。 在HttpUtil中加入一个sendOkHttpRequest() 方法, 如下所示:
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);
}Code language: JavaScript (javascript)
可以看到, sendOkHttpRequest() 方法中有一个okhttp3.Callback 参数, 这个是OkHttp库中自带的一个回调接口, 类似于我们刚才自己编写的HttpCallbackListener。 然后在client.newCall() 之后没有像之前那样一直调用execute() 方法, 而是调用了一个enqueue() 方法, 并把okhttp3.Callback 参数传入。 OkHttp在enqueue() 方法的内部已经帮我们开好子线程了, 然后会在子线程中去执行HTTP请求, 并将最终的请求结果回调到okhttp3.Callback 当中。
那么我们在调用sendOkHttpRequest() 方法的时候就可以这样写:
HttpUtil.sendOkHttpRequest("http://www.baidu.com", new okhttp3.Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
// 得到服务器返回的具体内容
String responseData = response.body().string();
}
@Override
public void onFailure(Call call, IOException e) {
// 在这里对异常情况进行处理
}
});Code language: JavaScript (javascript)
Previous: 解析JSON
Next: MaterialDesign