【Android】Retrofit 2.0 的使用一、概述二、原理二、使用

一、概述

Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库。来自官网的介绍:

A type-safe HTTP client for Android and Java

retrofit模型

  1. POJO或模型实体类 : 从服务器获取的JSON数据将被填充到这种类的实例中。
  2. 接口 : 我们需要创建一个接口来管理像GET,POST...等请求的URL,这是一个服务类。
  3. RestAdapter类 : 这是一个REST客户端(RestClient)类,retrofit中默认用的是Gson来解析JSON数据,你也可以设置自己的JSON解析器。

二、原理

在发起请求时,整个框架主要通过Call来封装每一次的请求。 调用同步方法时,会使用应用线程来发送请求; 调用异步方法时会通过 OkHttp 的 Dispatcher 提供的线程来执行请求。

Dispatcher:Dispatcher内部实现了懒加载无边界限制的线程池方式,同时该线程池采用了SynchronousQueue这种阻塞队列。SynchronousQueue每个插入操作必须等待另一个线程的移除操作,同样任何一个移除操作都等待另一个线程的插入操作。显然这是一种快速传递元素的方式,也就是说在这种情况下元素总是以最快的方式从插入者(生产者)传递给移除者(消费者),这在多任务队列中是最快处理任务的方式。

二、使用

  • 添加依赖(gradle)或导jar包 添加依赖 在modul的build文件下的dependencies中添加
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'

点击Sync Now (或)导jar包,点击下载 retrofit-2.0.0-beta2.jar| Retrofit库 converter-gson-2.0.0-beta2_.jar | Gson解析库 gson-2.4.jar | Gson解析库 okhttp-2.5.0.jar | Okhttp请求库 okio-1.6.0.jar | Okhttp请求库 说明: Retrofit依赖于okhttp,所以需要集成okhttp API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析

  • 添加权限 由于是网络请求,需要在manifest中添加网络请求的权限
<uses-permission android:name="android.permission.INTERNET"/>
  • 创建实体类 这是使用Gson解析,需要创建一个POJO(Java对象)。服务器返回的JSON数据不能在Java里直接使用,所以我们需要用模型类来做转换。这里使用jsonschema2pojo(需翻墙)来创建POJO。 得到JSON数据如下:

JSON数据 复制JSON字符串到输入框中,填写报名、类名,源代码类型选择JSON,注解类型选择Gson,点击Preview即可得到对应的POJO,如下图

复制到jsonschema2pojo中 点击preview,得到对应的实体类。将其拷贝到自己的工程中即可。

得到的实体类

import com.google.gson.annotations.SerializedName; @Generated("org.jsonschema2pojo") 可删除

POJO的转换推荐使用GsonFormat,用法不就不说了,自己去搜吧。简单易用

  • 创建一个Retrofit 对象(核心用法一)
Retrofit retrofit = new Retrofit.Builder()
              .addConverterFactory(GsonConverterFactory.create())//解析方法
               //这里建议:- Base URL: 总是以/结尾;- @Url: 不要以/开头
              .baseUrl("http://www.wangyinews.com.cn/")
              .build();
  • 接口申明(核心用法二)
public interface NewsService {
    /**
     * 根据newsid获取对应的资讯数据
     * 如果不需要转换成Json数据,可以用了ResponseBody;
     * @param newsId
     * @return call
     */
    @GET("News/{newsId}")
    Call<News> getNews(@Path("newsId") String newsId);
}

若需要重新定义接口地址可以使用@Url,例:

    @GET
    Call<List<CaigenActivitySubjectsBean>> getActivitySubjectsList(
            @Url String url,
            @QueryMap Map<String, String> map);

更多请求方法请参考:Retrofit网络请求Service,@Path、@Query、@QueryMap

  • 创建访问API的请求(核心用法三)
NewsService api = retrofit.create(NewsService .class);
Call<News> call = service.getNews("123456");
  • 同步调用(核心用法四)
News news = call.execute();
  • 异步调用(核心用法五)
call.enqueue(new Callback<News>(){  
           @Override  
           public void onResponse(Response<News> response) {  
               //成功返回数据后在这里处理,使用response.body();获取得到的结果
               News news = response.body();
            }  
            @Override  
            public voidonFailure(Throwable t) {  
               //请求失败在这里处理  
           }  
       });  
  • 取消请求(核心用法六)
call.cancel();  

完成以上步骤就可以实现一个简单的网络请求了。

Tips: 当返回结果错误,调用response.errorBody().string();可以得到String类型的请求结果,但再次调用response.errorBody().string();得到的结果为""。具体原因不明

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构师学习

Spring面试底层原理的那些问题,你是不是真的懂Spring?

4224
来自专栏JAVA高级架构

Java面试分享(题目+答案)

2823
来自专栏沃趣科技

MySQL中server_id一致带来的问题

简 介 我们都知道在MySQL搭建复制环境的时候,需要设置每个server的server_id不一致,如果主库与从库的server_id一致,那么复制会失败。...

4096
来自专栏java学习

你竟敢说你懂Spring框架?有可能你是没看到这些...(上)

所以,特地去搜刮了一些关于spring的面试题,希望能帮助各位同学在升职加薪的路上,一去不复返。

1182
来自专栏精讲JAVA

关于Spring底层原理面试的那些问题,你是不是真的懂Spring?

Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员...

1.8K3
来自专栏程序猿DD

Hystrix降级逻辑中如何获取触发的异常?

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hyst...

1373
来自专栏向治洪

svn错误对照表

#, c-format msgid "Destination '%s' is not a directory" msgstr "目的 “%s” 不是目录" ...

3455
来自专栏崔庆才的专栏

是时候抛弃print了,开始体验下logging的强大吧!

2212
来自专栏阿杜的世界

RocketMQ学习-NameServer-1

NameServer在RocketMQ中的角色是配置中心,主要有两个功能:Broker管理、路由管理。因此NameServer上存放的主要信息也包括两类:Bro...

1253
来自专栏java学习

关于Spring 和 Spring MVC的43个问题【问题汇总】

通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。

931

扫码关注云+社区

领取腾讯云代金券