1.简介
HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个高效的HTTP客户端,它有以下默认特性:
- 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
- 连接池减少请求延时
- 透明的GZIP压缩减少响应数据的大小
- 缓存响应内容,避免一些完全重复的请求
当网络出现问题的时候OkHttp依然坚守自己的职责,它会自动恢复一般的连接问题,如果你的服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP,OkHttp使用现代TLS技术(SNI, ALPN)初始化新的连接,当握手失败时会回退到TLS 1.0。
note: OkHttp 支持 Android 2.3 及以上版本Android平台, 对于 Java, JDK 1.7及以上.
(以上都是抄的)
2.使用
(1).添加网络权限
在AndroidManifest.xml
添加如下代码
<uses-permission android:name="android.permission.INTERNET"/>
(2).添加依赖
在build.gradle
下添加
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.google.code.gson:gson:2.7'
(3).基本使用
异步网络请求
- new OkHttpClient
- 构造Request对象
- 创建call对象
- 通过
call.enqueue()
来提交异步网络请求
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)//网络请求的网址
.get()//默认是GET请求,可省略,也可以写其他的
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().toString());
}
});
同步网络请求
前面的步骤和异步的相同,但是他通过call.execute()
来发送网络请求,由于网络请求是延时的,会阻塞调用的线程,所以在Android中应放在子线程中执行。
note.Android 3.0
不允许在主线程访问网络。
Gson的使用
- 创建gson的对象
- 创建数据类的对象
Gson gson = new Gson();
Person person = gson.fromJson(jsonData,Person.class);//非数组
List<Person> people = gson.fromJson(jsonData,new TypeToken<List<Person>>(){}.getType());//数组
这样,我们就完成了通过网络请求对数据的处理。
那什么是数据类呢???
其实很简单,简单的说就是用来存放我们获取的json格式数据的类。他首先需要有和json一样的数据结构,其次我们建议将变量全部设为private,然后去实现它的get和set方法(如果是只读数据类),则只需要实现get方法即可。
example :
import java.util.List;
import java.util.Map;
public class Actor {
private String name;
private List<Map> fans;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Map> getFans() {
return fans;
}
public void setFans(List<Map> fans) {
this.fans = fans;
}
}
{
"name":"王尼玛",
"fans":[{
"name":"小王",
"age":"7"
},{
"name":"小尼玛",
"age":"10"
}]
}