OkHttp框架介绍与用法
作用
OkHttp主要用于对String这类的数据进行网络读取的操作,文件的上传,但在图片的缓存处理上不够好,需要手动设置缓存区使用【以Android Studio为例】
一、添加OkHttp框架
Android Studio中File→Project Structure→找到对应的Module项目→Denpendencies→点击加号→Library Dependency→输入你所需要的框架名称,这里需要添加两个框架:
com.squareup.okhttp3:okhttp:3.2.0'
com.squareup.okio:okio:1.7.0'
二、创建一个OkHttpClient对象,后期需要通过该对象发出网络请求【两种方式】
1、无缓存创建方式
private OkHttpClient client = new OkHttpClient();
2、有缓存创建方式
private OkHttpClient client;
//如果需要手动设置或修改缓存处理,即超时处理,使用以下方式:通过builder对象设置缓存及超时的处理
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//设置连接超时,当前为10小时
builder.connectTimeout(10, TimeUnit.HOURS);
//设置读取时间超时
builder.readTimeout(10, TimeUnit.HOURS);
//设置写入数据,上传数据超时时间
builder.writeTimeout(10, TimeUnit.HOURS);
//设置缓存信息的处理:创建缓存对象,构造方法用于控制缓存位置及最大缓存大小【单位是Byte】
Cache cache = new Cache(new File("/mnt/sdcard/usher"), 10 * 1024 * 1024);
builder.cache(cache);
//通过builder对象初始化OkHttp对象
client = builder.build();
三、网络数据的处理方式【整理了四种】
1、GET请求方式1
*步骤
* 1、封装Request对象,用于设置请求的网址与请求的条件
* 2、通过初始化好的Builder对象设置一些网络请求信息【url用于设置连接的网址】
* 3、通过Builder设置好相关信息后,只需要通过build方法即可得到对应的Request对象
* */
String url = "http://bz.budejie.com/?typeid=2&ver=3.4.3&no_cry=1&client=android&c=wallPaper&a=category";
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);//获取本次请求任务的Call对象
//执行请求
call.enqueue(new Callback() {
@Override//请求发送失败调用的方法
public void onFailure(Call call, IOException e) {
Log.i("==", "onFailure: 数据获取失败");
}
@Override//请求发送成功调用的方法:该方法运行在子线程中,如果想通过结果更新页面需要通过Hanlder将结果传入主线程
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.i("==", "本次请求的结果为:" + result);
Log.i("==", "onResponse 方法:" + Thread.currentThread().getName());
Log.i("==", "缓存的位置 " + client.cache().directory().getAbsolutePath());
Log.i("==", "缓存的已用大小 " + client.cache().size());
Log.i("==", "缓存的最大大小 " + client.cache().maxSize());
//请在onCreate方法中自己建立Handler对象
Message message = Message.obtain();
message.what = 1;
message.obj = result;
handler.sendMessage(message);
}
});
2、GET请求方式2
final Call call = client.newCall(
new Request.Builder()
.url("http://bz.budejie.com/?typeid=2&ver=3.4.3&no_cry=1&client=android&c=wallPaper&a=category")
.build()
);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
Log.i("==", "run: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
3、POST请求方式
//通过RequestBody的create方法进行请求条件的封装
RequestBody body = RequestBody.create(
//参数1:数据类型
MediaType.parse("application/json; charset=utf-8"),
//参数2:请求条件
"platform=2&gifttype=1&compare=60841c5b7c69a1bbb3f06536ed685a48"
);
//封装请求对象
final Request request = new Request.Builder()
.url("http://zhushou.72g.com/app/gift/gift_list/")
.post(body)
.build();
final Call call = client.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
Log.i("==", "run: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
4、文件的上传
File file = new File("/storage/emulated/0/DCIM/Screenshots/iPhone.png");//创建文件对象
RequestBody body = RequestBody.create(
MediaType.parse("text/x-markdown; charset=utf-8"),
file
);
final Call call = client.newCall(new Request.Builder()
.url("https://api.github.com/markdown/raw")
.post(body)
.build()
);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
Log.i("", "run: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
四、取消OkHttp网络访问
//只要把某个请求对象的Call对象调用cancel()方法即可
call.cancel();
总结:OkHttp主要多用于文字类型数据的处理,但因为其需要手动设置缓存,因此在获取图片等类型的数据上优势不大。
PS:这是我第一次使用Markdown写文章,挺舒服好用,强烈推荐各位做文案或产品以及各位程序员同胞使用
另:欢迎关注我的B站频道:Lollipop丶Guy的B站频道
内容:科技+音乐