Retrofit可以理解为OkHttp的加强版,也是一个网络加载框架,底层是使用OkHttp封装的,网络请求工作本质是OkHttp完成,而Retrofit负责网络请求接口的封装。
Retrofit2的优点
1.超级解耦
2.可以配置不同的HttpClient来实现网络请求
3.支持同步、异步和RxJava
4.可以配置不同的反序列化工具来解析数据:如json、xml
5.请求速度快,使用非常方便灵活
Retrofit2配置
implementation 'com.squareup.retrofit2:retrofit:2.5.0' //Retrofit依赖
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'//可选依赖,解析json字符所用
Retrofit2的使用步骤
1.定义接口类(封装URL地址和数据请求)
2.实例化Retrofit
3.通过Retrofit实例创建接口服务对象
4.接口服务对象调用接口中的方法,获取Call对象
5.Call对象执行请求(异步,同步请求)
get请求
String baseURL = "https://www.xxxxx.com/abc/"; //从头开始到任意一个斜杠结束
public interface MyServer{
@GET("json?cid=9")
Call getData();
}
//获取Retrofit对象
Retrofit retrofit = new Retrofit.Builder().baseUrl(baseURL).build();
//通过Retrofit获取接口服务对象
MyServer server = retrofit.create(MyServer.class);
//接口对象调用其方法获取call对象
Call data = server.getData();
//call执行请求
data.enqueue(new Callback(){
@Override
public void onResponse(Call call, Response response){
try{
String json = response.body().string();
}catch(Exception e){}
}
@Override
public void onFailure(Call call, Throwable t){
}
});
post请求
String URL = "https://www.xxxx.com/abc/";
public interface MyServer{
//POST("search?")和POST("search") 相同;
//@Field("key") String value post请求用来提交参数的
//@FormUrlEncoded post请求提交form表单的时候如果有参数,需要填加这个注解,用来将提交的参数编码,post请求不提交参数,不要加
//@Field和@FieldMap一样,@FieldMap只不过是把一个一个的参数,合成一个map
@POST("search?")
@FormUrlEncoded
Call postData1(@Field("key") String appkey, @Field("name") String appname);
@POST("search")
@FormUrlEncoded
Call postData2(@FieldMap Map map);
}
private void initPostEnqueue(){
//1.创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder().baseUrl(URL).build();
//2.获取接口服务对象
MyServer myServer = retrofit.create(MyServer.class);
//3.获取Call对象
//方式一
Call call1 = myServer.postData1("123", "45666");
//方式二
Map map = new HashMap<>();
map.put("123", "4566");
//不用切换主线程了,因为Retrofit帮我们切过了
//okHttpClient需要自己切换主线程
Call call = myServer.postData2(map);
//4.Call对象执行请求
call.enqueue(new Callback(){
@Override
public void onResponse(Call call,Response response) {
try {
String result = response.body().string();
Log.e("retrofit", "onResponse: "+result);
tv.setText(result);//默认直接回调主线程
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call call, Throwable t) {
Log.e("retrofit", "onFailure: "+t.getMessage());
}
});
}
Retrofit的注解
转换器
Gson: com.squareup.retrofit2:converter-gson
Jackson: com.squareup.retrofit2:converter-jackson
Moshi: com.squareup.retrofit2:converter-moshi
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Simple XML: com.squareup.retrofit2:converter-simplexml
Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
Gson转换器的使用:
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.xxx.com/abc/")
.addConverterFactory(GsonConverterFactory.create()).build();
创建一个实体类UserBean.
public interface GithubService{
@GET("users/{user}")
Call getUserString(@Path("user") String user);
}
GithubService service retrofit.create(GithubService.class);
Call call = service.getUserString("aaaaa");
call.enqueue(new Callback(){
@Override
public void onResponse(Call call, Response response){
UserBean userBean = response.body();
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
注意:接口中返回的类型Call的泛型要么是ResponseBody要么是实体类,不支持其他类型。
OkHttp、Volley、Retrofit的对比
1.Volley VS OkHttp
Volley的优势在于封装更好,而OkHttp需要足够的能力再进行一次封装。
而OkHttp的优势在于性能更高,因为基于NIO和Okio,性能上比Volley更快。
从硬盘读取数据,第一种方式就是程序一直等,数据读完后才能继续操作,这种是最简单的也叫阻塞式 IO,还有一种就是你读你的,我程序接着往下执行,等数据处理完你再来通知我,然后再处理回调。而第二种就是 NIO 的方式,非阻塞式。
所以 NIO 当然要比 IO 的性能要好了, 而 Okio 是 Square 公司基于 IO 和 NIO 基础上做的一个更简单、高效处理数据流的一个库。
Volley内部同样支持使用OkHttp,本身Volley封装也更容易,扩展性更好。
2.OkHttp VS Retrofit
Retrofit基于OkHttp而做的封装,首选Retrofit。
3.Volley VS Retrofit
封装都不错,但是Retrofit解耦的更彻底。默认使用OkHttp性能上比Volley更好,如果项目采用的RxJava,那更推荐Retrofit。
都掌握的情况下优先使用Retrofit,如果不是很了解Retrofit,优先使用Volley。