今天学习了一下关于网络框架OkHttp,我今天看了一下,应该是最新的是3.3版本了吧.所以我们要在Gradle中要配置
compile files('libs/okio-1.9.0.jar')
compile 'com.squareup.okhttp3:okhttp:3.3.1'
因为OkHttp内部依赖okio,所以我们两个包都要导入.
当然我们需要介绍一下OkHttp的好处了:
一般的get请求
一般的post请求
基于Http的文件上传
文件下载
加载图片
支持请求回调,直接返回对象、对象集合
支持session的保持
二.技能实战
get请求
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder().get().url(image_path).build();
client.newCall(request).enqueue(new Callback() {//加入队列,这里是异步处理
//这里是利用了队列的回调,返回成功与不成功的信息
@Override
public void onFailure(Request request, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Response response) throws IOException {
Message message = mHandler.obtainMessage();//获得信息
if (response.isSuccessful()) {
message.what = SUCCESS_STATUS;//成功
message.obj = response.body().bytes();
mHandler.sendMessage(message);
} else {
mHandler.sendEmptyMessage(FAIL_STATUS);//返回失败状态
}
}
上面的逻辑我们可以分析到几个问题:
通过参数url访问,并且构造一个request 对象
通过request构造一个call,来进行任务封装,当然这里我们可以看到我们通过将call放到enqueue作为我们的任务调度队列
我们在成功相应的OnRequest中,存在几个类型的回调
response.body.bytes(),二进制字节数组
reponsee.body.string(),字符串
response.body().byteStream(),流对象
这个相应的调度是在子线程的,所以我们上面通过Handler,来发送信息,告诉UI主线程进行界面的刷新.
call存在着异步的调度enqueue,同步的调度execute(会堵塞).
FormEncodingBuilder form_builder = new FormEncodingBuilder();//表单对象,包含以input开始的对象
if (params != null && params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
form_builder.add(entry.getKey(), entry.getValue());
}
RequestBody request_body=form_builder.build();
Request request = new Request.Builder().url(url).post(request_body).build();//采用post方式提交
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Response response) throws IOException {
if (response!=null&&response.isSuccessful()){ //这里获取返回信息
onSuccessJsonObjectMethod(response.body().string(), callBack);
}
}
构造的是FormEncodingBuilder来添加键值对.
文件上传
File file = new File(Environment.getExternalStorageDirectory(), "beijingbeijing.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, “Fung”))
.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() {
//…
});
我们这里是通过拼接模拟器行为进行上传文件,并且添加了键值对和文件