在Android开发网络编程中,Okhttp已然成为了最火热的轻量级框架。本篇文章主要介绍Okhttp框架中的get和post方法使用。
1. 什么是Okhttp
Okhttp是由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)的网络框架。先来到Okhttp官网看看官方文档。相较于传统网络请求框架,Okhttp具有如下优点:
- 允许连接到同一个主机地址的所有请求,提高请求效率
- 共享Socket,减少对服务器的请求次数
- 通过连接池,减少了请求延迟
- 缓存响应数据来减少重复的网络请求
- 减少了对数据流量的消耗
- 自动处理GZip压缩
- 除了最基础的get和post方法,Okhttp框架还提供文件上传下载,加载图片,支持请求回调,直接返回对象、对象集合,支持session的保持。
2. 为工程添加依赖
在Android studio中新建Android项目后,打开project视图,app目录下的build.gradle文件,在dependencies{ }中添加Okhttp依赖。
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
完成后记得 Sync now
3. 添加测试布局文件
修改activity_main.xml布局文件,添加两个Button
和一个Textview
<Button
android:id="@+id/get"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="getOkhttp" />
<Button
android:id="@+id/post"
android:layout_below="@+id/get"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="postOkhttp" />
<TextView
android:id="@+id/Response"
android:layout_below="@id/post"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
记得在Mainacticity中声明控件,注册监听器。
4. 测试POST&GET方法
4.1 GET方法
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中添加网络权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
这是我们利用Okhttp的get方法获得的百度页面数据:
4.2 POST方法
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();
}
同样可以正确得到返回:
5. 总结&更多
Okhttp框架使用的关键在于主线程与子线程间的切换,在Android中:
- 网络请求必须在子线程中进行
- 网络请求返回的数据必须在主线程中更新UI界面
在Okhttp项目实战中,我们通常将网络请求操作封装在一个公共类,提供几个静态方法。使用时调用这些方法即可。这时我们可以使用:
client.newCall(request).enqueue(callback);
来替代execute()。可以看到我们使用这个方法时传入了okhttp3.Callback参数,enqueue方法已经自动开启了子线程,于是我们不再需要额外开启子线程。最后会在okhttp3.Callback中回调返回的数据,在UI线程中更新UI。
- 扫描关注 " 有趣的技术小窝",看天马行空的技术杂谈; 获实用的软件、资料分享