Retrofit2的使用总结

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的注解

image.png

转换器

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。

你可能感兴趣的:(Retrofit2的使用总结)