1)Android中网络请求的变化
HttpURLConnection -> HTTPClient -> Volley -> OKHttp
2)OKHttp是什么?
HttpURLConnection 和 HTTPClient 虽然都支持HTTPS、文件上传下载、配置超时、IPV6、连接池。但使用OKHttp可更高效的使用HTTP协议,使应用运行的更快,更节省流量。
OKHttp是一个高效的HTTP库,它的特点为:
-> 支持SPDY。共享同一个Socket来处理同一个服务器的所有请求
-> 可通过连接池减少请求延时
-> 支持GZIP来减少数据流量
-> 缓存相应数据来减少重复的网络请求
-> 可以解决常见的网络连接问题
-> 处理代理服务器问题和SSL握手问题
3)基本使用
-> GET请求
//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder() .url("https://github.com/hongyangAndroid")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(final Response response) throws IOException {
//String htmlStr = response.body().string();
}
});
-> POST请求
Request request = buildMultipartFormRequest( url, new File[]{file}, new String[]{fileKey}, null);
FormEncodingBuilder builder = new FormEncodingBuilder(); builder.add("username","张鸿洋");
Request request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
mOkHttpClient.newCall(request).enqueue(new Callback(){});
-> 基于Http的文件上传
File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(Headers.of( "Content-Disposition", "form-data; name=\"username\"")
, RequestBody.create(null, "张鸿洋"))
.addPart(Headers.of( "Content-Disposition", "form-data; name=\"mFile\";
filename=\"wjd.mp4\""), fileBody)
.build();
Request request = new Request.Builder()
.url("http://192.168.1.103:8080/okHttpServer/fileUpload")
.post(requestBody)
.build();
Call call = mOkHttpClient.newCall(request); call.enqueue(new Callback() { //... });
onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()
看到这,你可能会奇怪,竟然还能拿到返回的inputStream,看到这个最起码能意识到一点,这里支持大文件下载,有inputStream我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse执行的线程并不是UI线程。的确是的,如果你希望操作控件,还是需要使用handler等,
4)利用OKHttp来请求图片,并将请求到的图片加载到广告轮播组件中,实现步骤为:
①添加依赖
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.squareup.okio:okio:1.5.0'
②建立请求
String url ="http://112.124.22.238:8081/course_api/banner/query?type=1";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
③将请求入队
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
if(response.isSuccessful()){
String json = response.body().string();
try{
JSONArray array = new JSONArray(json);
for(int i = 0; i<array.length(); i++){
JSONObject jsonObject = array.getJSONObject(i);
Banner banner = new Banner();
banner.setName(jsonObject.getString("name"));
banner.setImgUrl(jsonObject.getString("imgUrl"));
banner.setDescription(jsonObject.getString("description"));
banners.add(banner);
}
}catch (Exception e){
e.printStackTrace();
}
//进行相应的操作,但这里是异步的
initSlider();
}
}
});