在Android开发网络编程中,Okhttp已然成为了最火热的轻量级框架。本篇文章主要介绍Okhttp框架中的get和post方法使用。
Okhttp是由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)的网络框架。先来到Okhttp官网看看官方文档。相较于传统网络请求框架,Okhttp具有如下优点:
在Android studio中新建Android项目后,打开project视图,app目录下的build.gradle文件,在dependencies{ }中添加Okhttp依赖。
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
修改activity_main.xml布局文件,添加两个Button
和一个Textview
记得在Mainacticity中声明控件,注册监听器。
This program downloads a URL and prints its contents as a string.
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
需要注意的是:由于网络连接非常耗时,Android不允许在主线程进行网络连接!因此我们需要改写一下代码,new一个新线程:
private void getOkhttp(){
new Thread(new Runnable() {
@Override
public void run() {
try{
OkHttpClient client =new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
Response response = client.newCall(request).execute();
String Data = response.body().string();
showData(Data);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
是的你没看错,我们又将网络请求的返回数据Response传出来了,因为我们在子线程中进行网络请求,而得到返回后,并不能在这个线程中更新UI,于是我们又必须回到主线程(也叫UI线程)更新UI界面显示返回数据:
private void showData(final String Data){
runOnUiThread(new Runnable() {
@Override
public void run() {
//
resp.setText(Data);
}
});
}
最后,不要忘了在AndroidManifest中添加网络权限:
This program posts data to a service
public static final MediaType JSON
= MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
post方法使用本质上和get相同,他能向服务器发送更多的数据,基于这一点,我们需要构建一个Request Body
对象存放需要向服务器提交的数据:
private void postOkhttp(){
new Thread(new Runnable() {
@Override
public void run() {
try{
OkHttpClient client =new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("zfk","666666")
.build();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.method("POST",requestBody)
.build();
Response response = client.newCall(request).execute();
String Data = response.body().string();
showData(Data);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
Okhttp框架使用的关键在于主线程与子线程间的切换,在Android中:
在Okhttp项目实战中,我们通常将网络请求操作封装在一个公共类,提供几个静态方法。使用时调用这些方法即可。这时我们可以使用:
client.newCall(request).enqueue(callback);
来替代execute()。可以看到我们使用这个方法时传入了okhttp3.Callback参数,enqueue方法已经自动开启了子线程,于是我们不再需要额外开启子线程。最后会在okhttp3.Callback中回调返回的数据,在UI线程中更新UI。