Retrofit 学习笔记(转载)

2018-09-27  本文已影响3人  EvanZch

转自 你真的会用Retrofit2吗?Retrofit2完全教程

一、使用步骤

1、在 Gradle加入Retrofit库的依赖

dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.0.2'
    // Retrofit库
  }

2、添加网络权限

AndroidManifest.xml

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

3、接口定义

public interface BlogService {
    @GET("blog/{id}")
    Call<ResponseBody> getBlog(@Path("id") int id);
}

定义接口,创建请求方法。

4、创建Retrofit实例

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://localhost:4567/")
        .build();

Retrofit2 实例创建通过Retrofit.Builder创建,并要通过baseUrl方法设置URL

注1:Retrofit2 的baseUrl中的路径必须以/结束,某些特殊情况下可以隐藏比如 https://www.baidu.com?key=value,因为这个URL隐含的路径就是 /(斜线,代表根目录) ,而后面的?key=value在拼装请求时会被丢掉所以写上也没用。

5、创建代理对象

BlogService service = retrofit.create(BlogService.class);

由于前面定义的接口没办法调用方法,所以需要通过Retrofit实例创建一个代理对象。

6、接口调用

Call<ResponseBody> call = service.getBlog(2);
// 用法和OkHttp的call如出一辙,
// 不同的是如果是Android系统回调方法执行在主线程
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        try {
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        t.printStackTrace();
    }
});

二、Retrofit注解详解

Retrofit一共有22个注解。

1、http请求方法

img

Http可以通过其三个属性 :methodpath,hasBody 来实现其他的请求方法

public interface BlogService {
    /**
     * method 表示请求的方法,区分大小写
     * path表示路径
     * hasBody表示是否有请求体
     */
    @HTTP(method = "GET", path = "blog/{id}", hasBody = false)
    Call<ResponseBody> getBlog(@Path("id") int id);
}

2、标记类

img

Streaming : 文件下载,如果没有添加这个字段,就是一次性下载后再保存,如果遇到大文件很容易造成内存溢出。

3、参数类

img

Field 和 FieldMap 与 FormUrlEncoded注解配合

Part 和 PartMap 与 Multipart 注解配合,适合文件上传情况。

{占位符} 和 path尽量只用在URL的path部分,url中的参数使用Query和QueryMap代替。

三、Gson和Converter

在默认情况下Retrofit只支持将HTTP的响应体转换换为ResponseBody,这也是为什么我在前面的例子接口的返回值都是 Call<ResponseBody>, 但如果响应体只是支持转换为ResponseBody的话何必要引入泛型呢, 返回值直接用一个Call就行了嘛,既然支持泛型,那说明泛型参数可以是其它类型的, 而Converter就是Retrofit为我们提供用于将ResponseBody转换为我们想要的类型。

引入Gson支持:

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

通过GsonConverterFactory为Retrofit添加Gson支持:

Gson gson = new GsonBuilder()
      //配置你的Gson
      .setDateFormat("yyyy-MM-dd hh:mm:ss")
      .create();

Retrofit retrofit = new Retrofit.Builder()
      .baseUrl("http://localhost:4567/")
      //可以接收自定义的Gson,当然也可以不传
      .addConverterFactory(GsonConverterFactory.create(gson))
      .build();

4、RxJava与CallAdapter

说到Retrofit就不得说到另一个火到不行的库RxJava,网上已经不少文章讲如何与Retrofit结合,但这里还是会有一个RxJava的例子,不过这里主要目的是介绍使用CallAdapter所带来的效果。

第3节介绍的Converter是对于Call<T>T的转换,而CallAdapter则可以对Call转换,这样的话Call<T>中的Call也是可以被替换的,而返回值的类型就决定你后续的处理程序逻辑,同样Retrofit提供了多个CallAdapter,这里以RxJava的为例,用Observable代替Call

引入RxJava支持:

implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
// 针对rxjava2.x(adapter-rxjava2的版本要 >= 2.2.0)
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

通过RxJavaCallAdapterFactory为Retrofit添加RxJava支持:

Retrofit retrofit = new Retrofit.Builder()
      .baseUrl("http://localhost:4567/")
      .addConverterFactory(GsonConverterFactory.create())
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
      // 针对rxjava2.x
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .build();
上一篇 下一篇

猜你喜欢

热点阅读