欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Retrofit扫盲

程序员文章站 2022-05-27 10:33:10
...

Retrofit是什么

  • 官方解释:A type-safe HTTP client for Android and Java。说人话就是网络请求的一个封装库。
  • 竟然你搜到了这篇文章,那说明至少你大概知道他是干撒的了,就类似google开发的volley库。

Retrofit优势

  • 与市面上那么多网络请求库相比,它的优势是使用简单,越用越觉得好用(大家都这么说;)),谁用谁知道:)

Retrofit怎么用

  • (接下来说下步骤,先不用全都懂,知道怎么用了,在去分析不懂的知识点)
  1. 第一步当然是导库,在app/build.gradle文件中
// 这个不必说
api 'com.squareup.retrofit2:retrofit:2.2.0'
// 这个是Retrofit底层需要用的okhttp
api 'com.squareup.okhttp3:okhttp:3.3.1'
// 这个是一种数据转化器,有多种可选
api 'com.squareup.retrofit2:converter-gson:2.1.0'
  1. 创建接口类(来的有点直接,先装不懂哈)
// 正式项目中,就是一个个接口调用方法
// 有么有注意到这个对象:ResponseBody,一般开发中,我们需要将服务端返回的数据转化成实体对象,哪这里就直接替换为我们定义好的对象即可
// 如果不需要转换Json数据,可以直接返回ResponseBody
// 若需要转换,例如:Call<GsonBean> get***;这样的话,需要添加Gson转换器处理json转换成对象的操作

public interface ApiStores {

    @GET("toutiao/index?")
    Call<ResponseBody> getDemoNews(@QueryMap Map<String, String> params);
    
    /**
     * @param params Get请求,带多个参数的接口
     * @return
     */
    @GET("toutiao/index?")
    Call<NewsBack> getNews(@QueryMap Map<String, String> params);

    /**
     * @param type Get请求,带一个参数的接口,当然这个跟上一个方法是一样效果,我写在这里是为了便于初学者明白一个参数写法
     * @return
     */
    @GET("toutiao/index?key=93ed89ccb2c409d1edad583eac67733c")
    Call<NewsBack> getNews(@Query("type") String type);

}
  1. 定义好第二步的接口后,接下来来看如何调用
    Retrofit retrofit = new Retrofit.Builder()
    // Base URL: 总是以/结尾
    // 这里以聚合数据服务来举例
    .baseUrl("http://v.juhe.cn/")
    // 这里添加json转对象的转换器
    .addConverterFactory(GsonConverterFactory.create())
    .build();

    ApiStores apiStores = retrofit.create(ApiStores.class);
    // 添加参数
    HashMap<String, String> params = new HashMap<>();
    params.put("type", "top");
    params.put("key", "93ed89ccb2c409d1edad583eac67733c");
    Call<NewsBack> call = apiStores.getNews(params);
    // 开启异步请求,注意还有同步请求的功能提供
    call.enqueue(new Callback<NewsBack>() {
            @Override
            public void onResponse(Call<NewsBack> call, retrofit2.Response<NewsBack> response) {
                NewsBack back = response.body();
                // 这段代码可忽略,实际情况回调进行数据处理刷新UI即可
                if (iCallBackListener != null) {
                    iCallBackListener.callBack(back);
                }
            }

            @Override
            public void onFailure(Call<NewsBack> call, Throwable t) {

            }
    });
  1. 其实走完上面3步,程序员拿走主意应该算是告一段落,基本上网络数据算是走完流程

其实Retrofit的好用远远不止使用简单这一层。可以衍生的点

  • 5.1 结合Rxjava让网络请求更优雅
  • 5.2 可以选最有转化器,例如:Jackson、Protobuf等,让网络请求效率更高
  • 5.3 添加各种拦截器,让网络请求更顺畅,交互更人性化
    等等

参考链接

  1. http://square.github.io/retrofit/
  2. http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1016/3588.html
  3. http://wuxiaolong.me/2016/01/15/retrofit/
  4. http://bxbxbai.github.io/2015/12/13/retrofit2/