本篇学习Android网络请求中最常用的okHttp
OkHttp是由Square公司贡献的轻量级网络请求框架。
GIthub地址 :OkHttp
下面开始学习OkHttp的使用
准备工作
// okHttp 3.14
implementation 'com.squareup.okhttp3:okhttp:3.14.9'
添加权限
<uses-permission android:name="android.permission.INTERNET" />
下面我们就可以正式开始了
关于OkHttp的请求方式有同步和异步两种,下面分别学习
get和post都有同步和异步两种方式
同步
-
get的同步
get的同步请求,同步请求在子线程中进行,更新UI要在UI线程中操作。
OkHttpClient okHttpClient = new OkHttpClient();
// 参数可以在后面拼接
Request request = new Request.Builder().url(BASE_URL).build();
Response response = null;
try {
response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
Log.i(TAG, "getDataSync: " + response.body().string());
handler.post(new Runnable() {
@Override
public void run() {
// 更新UI
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
通过response的isSuccessful方法判断请求,在成功后就可以进行处理了。如果对UI进行操作需要在主线程处理。
-
post的同步
post的同步请求只要在get的基础上,在Request的实例化后面拼接上post()方法就可以了。
下面是异步请求。
异步
异步请求的回调是在子线程中,更新UI需要在主线程操作。
- get的异步
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(BASE_URL).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// Failure
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
Log.i(TAG, "onResponse: " + response.body().string());
// 更新UI
}
}
});
Ps:异步请求的enqueue()方法会自动将请求部分放入工作线程处理。回调方法是在工作线程中的。
- post的异步
post的异步和get的异步基本相同。和上面同步一样,只要在Request构建是调用post就可以了。
OkHttpClient client = new OkHttpClient();
// 表单请求体
FormBody.Builder builder = new FormBody.Builder();
builder.add("args1", "values1");
Request post = new Request.Builder().url(BASE_URL).post(builder.build()).build();
client.newCall(post).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// Failure
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
response.body().string();
// TODO
}
}
});
值得注意的地方是在调用post方法时,需要传入请求体参数,一个RequestBody类型的参数。这个参数可以分为四种情况。
- RequestBody类型参数
- FormBody对象
该对象用来传递以键值对形式的参数。上面的post异步就是通过该对象。 - RequestBody对象
该对象用来传递JSON或者File
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
String jsonString = "{"name":"Alex","sex":"Male"}";
// 在create方法的参数中可以添加File或者JSON
RequestBody requestBody = RequestBody.create(JSON, jsonString);
- MultipartBody对象
该对象可以传递复合类型的参数。
MultipartBody multipartBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("name", "Alex")
.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("file/*"), file))
.build();
- 自定义RequestBody对象
我们可以通过继承RequestBody来实现流的上传
以上就是OkHttp的使用。
参考
OkHttp的基本使用