美文网首页
Retrofit 学习笔记(转载)

Retrofit 学习笔记(转载)

作者: EvanZch | 来源:发表于2018-09-27 15:40 被阅读3次

转自 你真的会用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();

相关文章

  • Retrofit 学习笔记(转载)

    转自 你真的会用Retrofit2吗?Retrofit2完全教程 一、使用步骤 1、在 Gradle加入Retro...

  • Retrofit入门笔记

    Retrofit 是 square 的一个网络请求框架,本文记录Retrofit的学习笔记 Retrofit请求框...

  • Retrofit学习笔记

    Retrofit学习笔记 一、什么是Retrofit框架 Retrofit框架是Square公司出品的目前非常流行...

  • Retrofit源码解析

    转载请注明:http://www.qinglinyi.com/posts/retrofit/ 认识Retrofit...

  • Retrofit 学习笔记

    参考: 网络加载框架 - Retrofit 这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解) A...

  • retrofit 学习笔记

    ps: 我写这篇这是很晚了,也是怪我自己啊,一直以来拖拖拉拉的就是改不了,retrofit 看着好几次了,看完有些...

  • Retrofit学习笔记

    一、Retrofit简介 Retrofit是Square公司开发的一款针对Android网络请求的框架,Retro...

  • 学习Retrofit笔记

    本文是基于Retrofit2进行学习。首先你要知道Retrofit是一个网络请求框架,它的api 定义可以查阅官网...

  • Retrofit学习笔记

    注:以下内容为本人自己做(chao)的学习笔记,可能含有少儿不宜的误导性内容,学习Retrofit请看参考文章。。...

  • Retrofit 学习笔记

    前言 Retrofit是个极其优秀的库,特别是和rxjava结合起来,使用起来那是一个丝滑般爽。不过使用了一两年,...

网友评论

      本文标题:Retrofit 学习笔记(转载)

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