关闭

Retrofit结合RxJava使用说明

标签: RxJavaRetrofit
2178人阅读 评论(8) 收藏 举报
分类:

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--陕西

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

2
0
查看评论

Retrofit和RxJava结合使用例子分析

以GitHub上的一个例子进行分析一下 https://github.com/rengwuxian/RxJavaSamples 先讲下总体架构 分为基本、转换(MAP)、压合(ZIP)、TOKEN(FLATMAP)、TOKEN_高级(RETRYWHEN)、缓存(BEHAVIORSUBJEC...
  • u012354475
  • u012354475
  • 2016-05-03 15:59
  • 1177

Retrofit和RxJava结合使用

使用Retrofit的时候就不得不提到RxJava,RxJava是一个基于观察者模式的异步实现。关于RxJava的入门学习,强烈推荐《给Android开发者的RxJava详解》 https://gank.io/post/560e15be2dca930e00da1083 正如上篇博客所说,得...
  • tinyzhao
  • tinyzhao
  • 2016-09-30 16:12
  • 1259

retrofit2 的使用 ,绝对干货,希望收藏 rxjava + retrofit + okhttp

依赖代码: compile 'com.squareup.retrofit2:retrofit:2.0.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2' compile 'co...
  • JackLittlePig
  • JackLittlePig
  • 2018-01-02 17:34
  • 152

Retrofit2.0与RXJava2.0最新结合:

retrofit的基本配置跟之前的没有多少改变,可以看一下这篇文章: 需要的jar包: retrofit2.0的基本配置与缓存 return new Retrofit.Builder() .addConverterFactory(GsonConverterFactory...
  • changsimeng
  • changsimeng
  • 2017-04-06 15:42
  • 1297

RxJava与Retrofit实战总结

RxAndroid模块包含RxJava的Android特定的绑定代码。它给RxJava添加了一些类,用于帮助在Android应用中编写响应式(reactive)的组件。它提供了一个可以在给定的Android Handler上调度Observable的调度器 Scheduler,特别是在UI主线程上
  • duanyy1990
  • duanyy1990
  • 2016-08-21 20:49
  • 2920

带你解惑【Retrofit2 的使用以及配合RxJava的使用】

最近刚离职,前几天参加的一个面试被问到对Retrofit的使用是否了解,无奈,,确实没怎么用过。。上网一搜,什么??还没使用Retrofit2你就out了!!!被这几个大字赤裸裸的嘲讽了。好吧,还是先到厕所抽根烟冷静一会,回来开始研究下Retrofit2。 刚开始看的时候被这些什么 @Path 、...
  • xiaxiazaizai01
  • xiaxiazaizai01
  • 2017-04-26 17:41
  • 1349

RxJava,Retrofit,OkHttp3结合使用

首先 亮出 gradle apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaul...
  • sky_pjf
  • sky_pjf
  • 2016-05-13 15:20
  • 4714

Retrofit与RxJava结合并进行封装

Retrofit和RxJava的优点有哪些在此就不赘述了,之前已经有数位大神在各个网站上发了若干文章,博主深感受益匪浅。 我在这里仅仅介绍一下我最近尝试的封装方法,至于为啥要封装,答:因为懒。。。 我们可以看一下使用 retrofit进行Http请求的代码: okHttpClient = new...
  • l631768226
  • l631768226
  • 2017-01-04 13:26
  • 1041

浅谈Android MVP设计模式(简单结合RxJava+Retrofit)

什么是MVP 为什么要用MVP 怎么去完成一个MVP的设计呢 demo实例功能虽小五脏俱全 准备工作 View的基类 presenter的基类 Model的基类 具体的业务实现 转载请指明出处:http://blog.csdn.net/lupengfei1009/article/details/50...
  • lupengfei1009
  • lupengfei1009
  • 2016-03-26 21:43
  • 13076

一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了

在前面已经初步封装了一个MVP的网络请求框架,那只是个雏形,还有很多功能不完善,现在进一步进行封装。添加了网络请求时的等待框,retrofit中添加了日志打印拦截器,添加了token拦截器,并且对DataManager类进行了扩展,真正体现它的作用,并且对大量的重复代码做了一定封装,减少代码的冗余。...
  • aaaabbbb1019
  • aaaabbbb1019
  • 2017-12-11 13:49
  • 187
    个人资料
    • 访问:217287次
    • 积分:3261
    • 等级:
    • 排名:第12369名
    • 原创:70篇
    • 转载:10篇
    • 译文:0篇
    • 评论:228条
    多多支持
    博客专栏
    最新评论