Retrofit结合RxJava使用说明

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

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

时间: 2024-08-05 17:53:55

Retrofit结合RxJava使用说明的相关文章

Retrofit结合RxJava个人使用经验

Retrofit出来也蛮久了,每次听其他小伙伴说起来都是那种吊吊的感觉,所以自己也赶紧加入其中,用完之后感觉真的很棒,当然学习的时候也是遇到不少问题,爽歪歪的感脚.具体该怎么用Retrofit,推荐鸿洋的文章Retrofit2 完全解析 探索与okhttp之间的关系 ,写的比较清楚,我也不多花笔墨在这上面了,下面要说的是我个人使用Retrofit遇到的一些问题. 首先是引用库了,在module的build.gradle文件中添加 compile 'io.reactivex:rxjava:1.1.

使用Retrofit和Rxjava让你的网络请求更简单

去年的时候好多公司就已经使用Rxjava和Retrofit了,最近自自己学习了一下,感觉真的是很好用,让自己的网络请求变得更简单了,而且封装性极强. 首先做一下准备工作,导入需要引用的文件 compile 'com.android.support:appcompat-v7:25.1.0' testCompile 'junit:junit:4.12' compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0'

Mvp Retrofit Okhttp Rxjava

MainActivity package com.bwie.shexinhai; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.bwie.shexinhai.Adapter

RecyclerView+Retrofit+OkHttp+RxJava

*图片初始化public class FrescoClass extends Application{ @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); }} *主页面 public class MainActivity extends AppCompatActivity { private RecyclerView mRv; @Override protected void onCreat

retrofit和RxJava结合

public class MainActivity extends AppCompatActivity { @SuppressLint("CheckResult") protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ApiClient.retrofit().create(ApiSt

Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)

1,这一篇博客是和大家一起来封装我们最后的Dagger2,其实之前也写过关于简单的Dagger2,这里是地址,完全没了解的同学可以先去看一下这篇,感谢很多小伙伴一直在耐心的等待这一篇 2,Dagger2可以说是些技术中最难上手的,不过把主要的四个注解理解到位了,基本上就可以用了: @Inject Inject主要有两个作用,一个是使用在构造函数上,通过标记构造函数让Dagger2来使用(Dagger2通过Inject标记可以在需要这个类实例的时候来找到这个构造函数并把相关实例new出来)从而提供

Rxjava+ReTrofit+okHttp深入浅出-终极封装

Rxjava+ReTrofit+okHttp深入浅出-终极封装 背景: 学习Rxjava和retrofit已经很长时间了,功能确实很强大,但是使用起来还是有点复杂,代码的重复性太高,所以决定把基于retrofit和rxjava的处理统一封装起来,实现的功能: 1.Retrofit+Rxjava+okhttp基本使用方法 2.统一处理请求数据格式 3.统一的ProgressDialog和回调Subscriber处理 4.取消http请求 5.预处理http请求 5.返回数据的统一判断 效果: 封装

RxJava开发精要8 – 与REST无缝结合-RxJava和Retrofit

原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转载权,未经允许,不得转载! 译者 : yuxingxin 项目地址 : RxJava-Essentials-CN 在上一章中,我们学习了如何使用调度器在不同于UI线程的线程上操作.我们学习了如何高效的运行I/O任务而不用阻塞UI以及如何运行耗时的计算任务而不耗损应用性能.在最后一章中,我们将创建一个最终版的真

MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包含新闻、图片、视频3个大模块,代码封装良好

练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的,代码量还是有的,里面做了大量封装,整体代码整理得很干净,这个我已经尽力整理了.不管是文件(java.xml.资源文件)命名,还是布局设计尽量简单简洁,我对自己写代码的规范还是有信心的- -.代码不会写的很复杂,整个代码结构有很高的统一度,结构也比较简单清晰,方便理解.里面做了大量的封装,包括基类的构建和工具类的封装,再配合Dagger2的使用可以极大地减轻V层(Activity和Fragment)的代码,