Android技术知识Android文章Android开发

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

2018-10-30  本文已影响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

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

上一篇下一篇

猜你喜欢

热点阅读