应用中,许多地方会用到网络请求,所以这里写好在一个类的静态方法中,方便日后使用
注意:发送网络请求,一般开启子线程操作,但在子线程中,所有逻辑很快执行,所以服务器没来得及响应就结束了,也就没有响应的数据了,所以要用回调机制;还有,子线程也不能使用return返回数据,所以在回调机制中,成功访问,就将数据放在回调方法中
OKHttp:
- 类HttpUtil:
public class HttpUtil{
...
public static void sendOkHttpRequest(String address,okhttp3.Callback callback){
OkHttpClient client=new OkHttpClient(); //创建OkHttpClient实例
Request request=new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback); //Okhttp自带回调接口,将请求结果回调在okhttp3.Callback
}
}
说明:
① client.newCall(request).enqueue(callback); //Okhttp自带回调接口,将请求结果回调在okhttp3.Callback ,而不是用Response response=client.newCall(request).execute();直接将数据返回。
② enqueue(callback)中,已经开好子线程,让后实行HTPP请求,所以不用手动开启线程
- 调用 sendOkHttpRequest()时:
HttpUtil.sendOkHttpRequest("www.****.com",
new okhttp3.Callback(){
@Override
public void onResponse(Call call, Response response)throws IOException{
//服务器返回的数据就在此回调的Response response参数 中
String responseData = response.body().string();
/* 在做相关的数据处理即可 */
}
@Override
public void onFailure(Call call, IOException e){
//请求失败结果在这里,在这做异常处理
}
});
注意,不管使用官方的HTTPURLConnection(回调接口自定义),还是OKHttp(自带接口),最终的回调接口都还是在子线程中运行的,因此不可以进行任何的UI操作,除非借助rubOnUiThread()进行线程转换。