Retrofit结合RxJava使用说明

原创 2016年03月19日 19:55:05

PS:年后一直没有更新博客,实在是太忙了。今天周六也是终于抽出了时间,就决定写一篇Retrofit结合RxJava使用说明。刚好现在写的的项目中也有用到,趁热打铁简单说说。最近也不知道博客写什么内容,大家有什么想了解的内容,也可以评论告诉我,我尽力解答。

如果对Retrofit不了解可以看我之前的一篇博客:Retrofit 2.0使用 ,这次的内容也是在此基础上的。关于RxJava可以参考:学习RxJava(资料汇总),这里我就不多说了。

1.准备工作

我们需要添加相应的依赖:

    compile 'io.reactivex:rxjava:1.1.0'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'

2.使用

首先我在网上随便找了一个接口用于测试:http://apistore.baidu.com/microservice/cityinfo?,Get请求,参数是cityname也就是你要查询的城市名称。我以查询西安为例。

我们首先直接请求看一下返回结果:

{
    "errNum": 0,
    "retMsg": "success",
    "retData": {
        "cityName": "西安",
        "provinceName": "陕西",
        "cityCode": "101110101",
        "zipCode": "710000",
        "telAreaCode": "029"
    }
}

那么我们先写一个City对象用于Gson解析(这里我们只获取retData中的数据,后面我会用自定义转换器转换):

public class City {

    private String cityName;
    private String provinceName;
    private String cityCode;
    private String zipCode;
    private String telAreaCode;

    public City(String cityName, String provinceName, String cityCode, String zipCode, String telAreaCode) {
        this.cityName = cityName;
        this.provinceName = provinceName;
        this.cityCode = cityCode;
        this.zipCode = zipCode;
        this.telAreaCode = telAreaCode;
    }

    public String getProvinceName() {
        return provinceName;
    }

    public void setProvinceName(String provinceName) {
        this.provinceName = provinceName;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public String getCityCode() {
        return cityCode;
    }

    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

    public String getTelAreaCode() {
        return telAreaCode;
    }

    public void setTelAreaCode(String telAreaCode) {
        this.telAreaCode = telAreaCode;
    }
}

Api请求接口:

public interface CityApi {

    @GET("cityinfo?")
    Observable<City> getCityInfo(@Query("cityname") String cityname);

}

自定义转换器:

public class DeserializerCity <T> implements JsonDeserializer<T> {
    @Override
    public T deserialize(JsonElement je, Type typeOfT,
                               JsonDeserializationContext context) throws JsonParseException {
        // 转换Json的数据
        JsonElement results = je.getAsJsonObject().get("retData");
        return new Gson().fromJson(results, typeOfT);
    }
}

创建CityApi类:

    public class CityService {

    public static final String CITY_URL = "http://apistore.baidu.com/microservice/";

    private static Gson customGsonInstance = new GsonBuilder()
            .registerTypeAdapter(City.class,new DeserializerCity<City>())
            .create();

    private static Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(CITY_URL)
            .addConverterFactory(GsonConverterFactory.create(customGsonInstance))
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

    public static CityApi createCityService() {
        return retrofit.create(CityApi.class);
    }

}

调用:

public void getCityInfo(String cityname){
    CityApi service = CityService.createCityService();
    Subscription subscription = service.getCityInfo(cityname)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .unsubscribeOn(Schedulers.io())
                    .subscribe(new Subscriber<City>() {
                        @Override
                        public void onCompleted() {

                        }
                        @Override
                        public void onError(Throwable error) {

                        }
                        @Override
                        public void onNext(City city) {
                            Log.d("CityInfo:",city.getCityCode() + "--" + city.getProvinceName());
                        }
                    });

    }

结果:

D/CityInfo:: 101110101--陕西

以上就是简单的使用方法。觉得好的多多点赞!

版权声明:本文为博主原创文章,未经博主允许不得转载。http://blog.csdn.net/qq_17766199

相关文章推荐

Android自定义View之LoadingLayout

介绍上一篇博文写了一个通用的加载view,这篇在加载view的基础在包裹一层就是LoadingLayout了,主要的目的是免去每次加载时要隐藏主内容布局,然后加载成功之后显示主内容布局这些繁琐操作。如...
  • yissan
  • yissan
  • 2017年02月23日 11:27
  • 2347

Android_自定义标签ViewLayout

源代码在文章最后又链接自定义viewLayout实现标签View,UI的效果图如下, 如图,我们要自己实现带描边的,带花括号的,带三角形,带对勾的这样一个layout ,并且对勾和中间的虚线我们都...

RxJava与Retrofit结合使用案例

  • 2016年11月09日 10:38
  • 795KB
  • 下载

RxJava和Retrofit结合使用

前言:前段时间花了点时间学了一下RxJava和Retrofit,后面在实践中被没有用到,今天一看,呃,怎么又忘得差不多了。...

Android RxJava/RxAndroid结合Retrofit

  • 2016年04月13日 18:08
  • 15.52MB
  • 下载

Android RxJava/RxAndroid结合Retrofit使用

概述RxJava是一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。更重要的是:使用RxJava在代码逻辑上会非常简洁明了,尤其是在复杂的逻辑上。告别迷之缩进。RxAndro...

Retrofit+Rxjava结合使用(三)

1.Rxjava的介绍 2.Rxjava的原理 3.Rxjava重点解析 4.Retrofit与Rxjava的完美结合 1.build.gradle中添加配置: compile 'com.squar...

Rxjava+Retrofit结合使用时的开发技巧

## 概述 在开发中使用`RxJava+Retrofit`的网络框架,是时下的趋势,使用起来也非常的方便. 如果能够在一定程度上进一步封装,能够大大提高我们的开发效率....
  • wbwjx
  • wbwjx
  • 2016年06月24日 23:46
  • 634

Retrofit和RxJava结合使用

使用Retrofit的时候就不得不提到RxJava,RxJava是一个基于观察者模式的异步实现。关于RxJava的入门学习,强烈推荐《给Android开发者的RxJava详解》 https://g...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Retrofit结合RxJava使用说明
举报原因:
原因补充:

(最多只允许输入30个字)