美文网首页Android技术知识Android文章Android开发
Android小知识-Retrofit框架的介绍以及使用方式

Android小知识-Retrofit框架的介绍以及使用方式

作者: 爱读书的顾先生 | 来源:发表于2018-10-30 09:22 被阅读225次

    本平台的文章更新会有延迟,大家可以关注微信公众号-顾林海,包括年底前会更新kotlin由浅入深系列教程,目前计划在微信公众号进行首发,如果大家想获取最新教程,请关注微信公众号,谢谢!

    Retrofit是Square公司推出的一个HTTP的框架,主要用于Android和Java,Retrofit会将每一个HTTP的API请求变成一个Java的接口,使用起来非常方便,同时Retrofit又是一个Restful HTTP的网络请求框架的封装。

    image

    在上图中,我们会在应用层发起网络请求,同时请求会经过Retrofit这层,Retrofit会将我们的网络请求的参数进行封装,最后通过OkHttp层向服务端发起网络,服务端会将响应返回给OkHttp层,OkHttp层再将请求结果交给Retrofit层,最后再返回给应用层。

    总结来说:也就是说App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数,之后交由OkHttp完成后续的请求操作,在服务端返回数据后,OkHttp将原始数据的结果交给Retrofit,Reftrofit将根据用户的需求对结果进行解析。

    接下来讲解Retrofit的用法,首先添加网络访问权限以及Retrofit库的依赖:

    权限:

        <uses-permission android:name="android.permission.INTERNET" />
    

    Retrofit库的依赖:

        implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    

    创建服务端返回的数据类型:

    public class MyResponse {
        String title;
        String imgUrl;
        int collectNum;
    }
    

    创建一个用于描述网络请求的接口:

    public interface NetworkInterface {
        @GET("news/newsDetail")
        Call<MyResponse> getNewsDetails(@QueryMap Map<String,String> map);
    }
    

    Retrofit将每一个HTTP请求抽象成了Java接口类,同时采用注解方式来描述并配置网络的请求参数,内部通过动态代理将接口的注解转换成HTTP请求,上面通过注解@GET表示本次请求网络的方式是GET请求,括号内部定义了请求的部分URL ,getNewsDetail方法内的参数使用了@QueryMap注解,说明我们可以传入任何键值对集合Map。

    接着创建Retrofit并进行网络请求:

        private void initRetrofit() {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://icould.glh/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .build();
    
            NetworkInterface networkInterface = retrofit.create(NetworkInterface.class);
    
            Map<String, String> params = new HashMap<>();
            params.put("newsId", "1");
            params.put("token", "yud133f");
            Call call = networkInterface.getNewsDetails(params);
    
            call.enqueue(new Callback() {
                @Override
                public void onResponse(Call call, Response response) {
                    System.out.println(response.body());
                }
    
                @Override
                public void onFailure(Call call, Throwable t) {
                    System.out.println("请求错误");
                }
            });
        }
    

    通过Retrofit的Builder模式创建Retrofit对象,通过baseUrl来指定网络请求的URL,这个URL加上网络请求接口类中通过注解定义的URL,就凑成了完整的URL;通过addConverterFactory方法设置服务返回后数据的解析器,Retrofit可以指定任意的数据解析器,这里采用的是GSON数据解析器,需要在gradle中引入它的依赖库。

        implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    

    通过addCallAdapterFactory方法设置网络请求的适配器,Retrofit可以支持多种的网络请求适配器方式,比如Java8和RxJava,这里采用RxJava,通过gradle引入它的依赖。

        implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0'
    

    通过Retrofit的create方法创建网络请求接口实例networkInterface,接着调用网络请求接口实例中的getNewsDetails方法并传入相关的键值对集合。最后通过Call对象执行异步或同步请求,这里通过enqueue方法执行异步请求并传入Callback实现两个回调方法。

    总结:

    1. 添加Retrofit库的依赖以及网络权限。

    2. 创建服务器返回的数据类型的类。

    3. 创建用于描述网络请求的接口。

    4. 通过建造者模式创建Retrofit实例,并设置URL、数据解析器、网络请求适配器等等。

    5. 通过Retrofit的create方法创建网络请求的实例。

    6. 调用网络请求实例中的方法获取Call并发送网络请求。

    关于Retrofit的使用流程已经介绍完毕,下面大致讲讲Retrofit内部请求的一个流程,为后面源码分析做准备。

    Retrofit不是网络请求框架,它只是对网络请求框架的封装,在Retrofit中首先创建Retrofit这个类,它是Retrofit框架统一的一个入口,通过Retrofit的内部类Builder对网络请求的参数进行配置,Builder内部的ServiceMethod对象非常非常的重要,它对应着我们写好的接口类中的一个方法,通过动态代理的方式将我们自己定义好的接口以及接口中的参数、方法统一转换成一个个的HTTP请求,ServiceMethod对应的就是我们接口类当中定义好的方法,通过ServiceMethod可以解析方法中的各种注解,最后生成Request对象。创建完ServiceMethod对象之后,就可以创建OkHttpCall请求,通过这个OkHttpCall可以进行同步请求或异步请求。

    在ServiceMethod当中生成了三个非常重要的工厂类,分别是CallAdapter工厂、Converter工厂以及CallFactory。CallAdapter工厂用于生产CallAdatper,在Retrofit中默认会将我们的请求封装成OkHttp的Call对象, CallAdapter的作用就是将我们的OkHttp的Call转换成被不同平台调用的适配器。Converter工厂用于生产数据转换器Converter,使用Converter可以将返回的Response转换成我们能使用的Java对象。CallFactory是用于创建Call请求类的,在Retrofit中一个个HTTP请求被封装成Call类。

    有了OkHttpCall以及ServiceMethod中的三个工厂,就可以将网络请求OkHttpCall通过CallAdapter适配不同平台,在通过Converter解析返回的数据Response,如果是异步请求在拿到Response后会通过callbackExecutor进行线程切换来传递数据。


    838794-506ddad529df4cd4.webp.jpg

    搜索微信“顾林海”公众号,定期推送优质文章。

    相关文章

      网友评论

        本文标题:Android小知识-Retrofit框架的介绍以及使用方式

        本文链接:https://www.haomeiwen.com/subject/fopwtqtx.html