Android-->Rxjava与Retrofit2的结合实战

原创 2016年03月22日 15:26:43

阅读之前,请先了解:
RxJava/RxAndroid 入门初体验
Android–>Retrofit 2.0 beta2 使用方法

本文使用的版本信息:
compile ‘io.reactivex:rxjava:1.1.2’
compile ‘io.reactivex:rxandroid:1.1.0’
compile ‘com.squareup.retrofit2:retrofit:2.0.0’
compile ‘com.squareup.retrofit2:converter-gson:2.0.0’
compile ‘com.squareup.retrofit2:adapter-rxjava:2.0.0’


文章之前,需要有一个后台接口,并且可以返回数据:
假设接口是: http://192.168.1.12:8082/api
返回数据是:

{
    rid: 12,
    name_char: "马化腾",
    name_varchar: "埃里巴巴",
    name_float: 0,
    name_int: 0,
    name_tinyint: 0,
    name_time: 1478833860000,
    param: {
        pp1: "2",
        basd: "0123adf"
    }
}
//param:这个字段是传入的参数,封装成的json数据,又返回回来的.主要用于测试参数传递是否正确

有了接口,有了接口数据,就可以开始写Android代码了:

1:创建一个专门用于调用API服务的类

//public static String BASE_URL = "http://192.168.1.12:8082";//注意这个服务器地址
public interface RApiService {

    /**
    * @GET 表明方法是 get请求
    * "/api" 请求的接口,请注意前面的/符号
    * @Query 表示这是一个参数
    * Call<ResponseBody> :Call是必须的,ResponseBody是Retrofit默认的返回数据类型,也就是String体
    */

    @GET("/api")
    Call<ResponseBean> getApi(@Query("pa1") String va1, @Query("ba1") String va2);
    //getApi方法,等效于: http://192.168.1.12:8082/api?pa1=va1&ba1=va2


    /**
    * @POST 请求方式post
    * @Body 表示将requestBean对象转成成json string作为参数传递给后台
    */
    @POST("/api")
    Call<ResponseBean> postApi(@Body RequestBean requestBean);


    /**
    * @QueryMap 表示将map类型的params对象,转成键值对的形式作为参数传递给后台
    */
    @GET("/api")
    Call<ResponseBody> getApiString(@QueryMap Map<String, String> params);

    @POST("/api")
    Call<ResponseBody> postApiString(@Body RequestBean requestBean);

    /**
    * Observable 是RxJava的关键点,其他不变
    */
    @GET("/api")
    Observable<ResponseBody> getRxApiString(@QueryMap Map<String, String> params);

    @POST("/api")
    Observable<ResponseBean> postRxApiString(@Body RequestBean requestBean);
}

接口声明完之后, 就可以开始条用了.

2.创建Retrofit对象

//这是我封装的类,可以复制粘贴直接使用
public class RRetrofit {
    public static String BASE_URL = "http://192.168.1.12:8082";
    public static <T> T create(final Class<T> cls) {
        Retrofit.Builder builder = new Retrofit.Builder();
        Retrofit retrofit = builder
           .baseUrl(BASE_URL)//注意此处,设置服务器的地址
           .addConverterFactory(GsonConverterFactory.create())//用于Json数据的转换,非必须
           .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//用于返回Rxjava调用,非必须
           .build();
        return retrofit.create(cls);
    }
}
注意:
GsonConverterFactory.create(), 需要compile 'com.squareup.retrofit2:converter-gson:2.0.0'
RxJavaCallAdapterFactory.create(),需要 compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'

3.调用接口

public void button(View view) {
RApiService service = RRetrofit.create(RApiService.class);

/*get请求*/
Call<RApiService.ResponseBean> api = service.getApi("pa1_value", "ba1_value");
api.enqueue(new Callback<RApiService.ResponseBean>() {
 @Override
 public void onResponse(Call<RApiService.ResponseBean> call, Response<RApiService.ResponseBean> response) {
     append("getApi-->\n" + response.body().toString());
 }

 @Override
 public void onFailure(Call<RApiService.ResponseBean> call, Throwable t) {
     Log.e("", "");
     append("getApi error-->\n" + t.toString());
 }
});

Map<String, String> params = new HashMap<>();
params.put("bbb", "bbb_v");
params.put("aaa", "aaa_v");
Call<ResponseBody> apiString = service.getApiString(params);
apiString.enqueue(new Callback<ResponseBody>() {
 @Override
 public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
     Log.e("", "");
     try {
         append("getApiString-->\n" + response.body().string());
     } catch (IOException e) {
         e.printStackTrace();
     }
 }

 @Override
 public void onFailure(Call<ResponseBody> call, Throwable t) {
     Log.e("", "");
     append("getApiString error-->\n" + t.toString());
 }
});



/*post请求*/
RApiService.RequestBean requestBean = new RApiService.RequestBean();
requestBean.key1 = "KEY1";
requestBean.key2 = "KEY2";
requestBean.key3 = "KEY3";
requestBean.key4 = "KEY4";
Call<RApiService.ResponseBean> postApi = service.postApi(requestBean);
postApi.enqueue(new Callback<RApiService.ResponseBean>() {
 @Override
 public void onResponse(Call<RApiService.ResponseBean> call, Response<RApiService.ResponseBean> response) {
     Log.e("", "");
     append("postApi-->\n" + response.body().toString());
 }

 @Override
 public void onFailure(Call<RApiService.ResponseBean> call, Throwable t) {
     Log.e("", "");
     append("postApi error-->\n" + t.toString());
 }
});

Call<ResponseBody> postApiString = service.postApiString(requestBean);
postApiString.enqueue(new Callback<ResponseBody>() {
 @Override
 public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
     Log.e("", "");
     try {
         append("postApiString-->\n" + response.body().string());
     } catch (IOException e) {
         e.printStackTrace();
     }
 }

 @Override
 public void onFailure(Call<ResponseBody> call, Throwable t) {
     Log.e("", "");
     append("postApiString error-->\n" + t.getMessage());
 }
});

/*rx的使用*/
service.getRxApiString(params)
     .subscribeOn(Schedulers.newThread())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(new Subscriber<ResponseBody>() {
         @Override
         public void onCompleted() {
             append("getRxApiString onCompleted-->\n");
         }

         @Override
         public void onError(Throwable e) {
             append("getRxApiString onError-->\n" + e.getMessage());
         }

         @Override
         public void onNext(ResponseBody responseBody) {
             try {
                 append("getRxApiString onNext-->\n" + responseBody.string());
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     });
service.postRxApiString(requestBean).subscribeOn(Schedulers.newThread())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(new Subscriber<RApiService.ResponseBean>() {
         @Override
         public void onCompleted() {
             append("postRxApiString onCompleted-->\n");
         }

         @Override
         public void onError(Throwable e) {
             append("postRxApiString onError-->\n" + e.getMessage());
         }

         @Override
         public void onNext(RApiService.ResponseBean responseBody) {
             append("postRxApiString onNext-->\n" + responseBody.toString());
         }
     });
}

以上就是调用方式.


RxJava操作符学习推荐: https://github.com/YaYaStudio/RxJavaApp


至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.

版权声明:欢迎转载,转载请注明出处-->http://blog.csdn.net/angcyo

相关文章推荐

Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势

RxJava2+Retrofit+RxBinding解锁各种新姿势 本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发。 本篇文章内容包含以下内容 前言 RxJava2的基本介...
  • Demo006
  • Demo006
  • 2017年08月15日 22:17
  • 118

Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势

RxJava2+Retrofit+RxBinding解锁各种新姿势 本篇文章内容包含以下内容 前言 RxJava2的基本介绍 RxJava2观察者模式的介绍 RxJav...

MVP+Dagger2+Retrofit2.0+Rxjava看这一个例子就够了

MVP+Dagger2+Retrofit2.0+Rxjava的案例

基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建

我们很多开发者大都在小型公司,不了解大公司是怎么做Android网络框架的,也想知道那些用户量过千万的APP到底用了些什么技术,让我们一起来了解一下Android版的美团和Uber到底用了些什么技术。...

手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界

0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西。。 但是这...

Retrofit2+Rxjava2之优雅的封装

Retrofit2+Rxjava2之优雅的封装   这篇文章主要是教大家如何封装Retrofit2+Rxjava2,所以实现原理不做过多的解释,如有不付,额(你咬我呀!), 还有就是看这篇文章的同时,...

rxjava2.0+retrofit2.0初试水,小demo

一个简单的post异步。 1.添加依赖 compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.reactivex.rxjava2:rxan...

RxJava 与 Retrofit 结合的最佳实践

RxJava 与 Retrofit 结合的最佳实践

记录一下RxJava和Retrofit2之间导包的错误

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4....

Retrofit2源码解析(三)添加 RxJavaCallAdapterFactory适配器

Retrofit2源码解析(三)添加 RxJavaCallAdapterFactory适配器
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-->Rxjava与Retrofit2的结合实战
举报原因:
原因补充:

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