【Android】Retrofit2使用入门

in 默认分类 with 0 comment

介绍

Retrofit是Square公司基于OkHttp开发的一款针对Android的网络请求框架。于其他网络框架不同的是,它更多使用注解的方式提供功能。准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装

04

快速入门

使用retrofit2大致有以下步骤,分别是

  1. 集成

截止北京时间2019/02/12,最新版本为v2.5.0,官方共提供3种方法用于集成到项目中,下面这些还包含了Gson解析器,这个就看个人洗好咯

  1. 创建相关的请求类

    接下来我们就可以创建向服务器发送请求的相关代码。这里先打个比方,假如我现在需要Get请求http://bing.creepersan.com/api/v1/url来获取相应的日本必应历史图片信息。我们可以这样写

    interface BingUrlRequest{
    
        // @FormUrlEncoding
        @GET("api/v1/url")
        fun getBingUrl(@Query("count") count:Int=12):Call<BingUrlResponse>
    
    }
    

    其中我们可以看到这上面有三个注解(虽然有一个是注释的),他也对应着Retrofit2的三大注解分类,其总表如下

    03

  1. 创建相关服务器返回信息类

    然后是创建服务器返回的相关信息类。还是请求上面的Api接口,如果请求正常的话,他的回复应该是这样的。

    02

    那么我们可以根据这个Json写出下面的服务器返回数据格式

    class BingUrlImageItemBean{
        var date:Int = 20000000
        var year:Int = 0
        var month:Int = 0
        var day:Int = 0
        var title:String = ""
        var location:String = ""
        var author:String = ""
        var img_url:String = ""
        var img_url_thumbnail:String = ""
        var img_url_base:String = ""
    }
    
    class BingUrlDataBean{
        var itemCount:Int = 0
        var imgList: ArrayList<BingUrlImageItemBean>? = null
    }
    
    class BingUrlResponse{
        var flag:Int = 0
        var data : BingUrlDataBean? = null
    }
    

    需要注意的是,所创建的变量名必须要和Json返回的键名相对应,而且层级关系也要和Json保持一致。

  2. 创建Retrofit实例

    相关代码如下

            val retrofit = Retrofit.Builder()
                    .baseUrl("http://bing.creepersan.com")
                    .addConverterFactory(GsonConverterFactory.create()) // 设置数据解析器
                    //.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 支持RxJava平台
                    .build()
    
    • 关于数据解析器(Converter)

      Retrofit支持多种数据解析方式,使用时需要在Gradle添加依赖

      数据解析器Gradle依赖
      Gsoncom.squareup.retrofit2:converter-gson:版本
      Jacksoncom.squareup.retrofit2:converter-jackson:版本
      Simple XMLcom.squareup.retrofit2:converter-simplexml:版本
      Protobufcom.squareup.retrofit2:converter-protobuf:版本
      Moshicom.squareup.retrofit2:converter-moshi:版本
      Wirecom.squareup.retrofit2:converter-wire:版本
      Scalarscom.squareup.retrofit2:converter-scalars:版本
    • 关于网络请求适配器(CallAdapter)

      Retrofit支持多种网络请求适配器方式:guava、Java8和rxjava 。使用时如使用的是 Android 默认的 CallAdapter,则不需要添加网络请求适配器的依赖,否则则需要按照需求进行添加
      Retrofit 提供的 CallAdapter

      网络请求适配器Gradle依赖
      guavacom.squareup.retrofit2:adapter-guava:版本
      Java8com.squareup.retrofit2:adapter-java8:版本
      rxjavacom.squareup.retrofit2:adapter-rxjava:版本
  3. 发送请求并处理返回数据

    发送一个异步请求,代码如下所示

    val request = retrofit.create(BingUrlRequest::class.java)
    val call = request.getBingUrl(3)
    call.enqueue(object : Callback<BingUrlResponse> {
        override fun onFailure(call: Call<BingUrlResponse>, t: Throwable) {
            // 连接失败处理
        }
        override fun onResponse(call: Call<BingUrlResponse>, response: Response<BingUrlResponse>) {
            // 连接成功处理
        }
    })
    

    发送一个同步请求代码如下所示

            val request = retrofit.create(BingUrlRequest::class.java)
            val call = request.getBingUrl(3)
            val response = call.execute()
            // 处理response
    

参考资料

这是一份很详细的 Retrofit 2.0 使用教程 - Carson_Ho

Android进阶之光 - 刘望舒