RxJava 的使用入门

一、什么是 Rxjava?
RxJava 是一个响应式编程框架,采用观察者设计模式。所以自然少不了 Observable 和 Subscriber 这两个东东了。
RxJava 是一个开源项目,地址:https://github.com/ReactiveX/RxJava

还有一个RxAndroid,用于 Android 开发,添加了 Android 用的接口。地址:https://github.com/ReactiveX/RxAndroid
二、例子
通过请求openweathermap 的天气查询接口返回天气数据
1、增加编译依赖

1 dependencies {
2     compile fileTree(dir: "libs", include: ["*.jar"])
3     compile "com.android.support:appcompat-v7:22.0.0"
4     compile "io.reactivex:rxjava:1.0.9"
5     compile "io.reactivex:rxandroid:0.24.0"
6     compile "com.squareup.retrofit:retrofit:1.9.0"
7 }


retrofit 是一个 restful 请求客户端。详见:http://square.github.io/retrofit/
2、服务器接口

1 /**
2  * 接口
3  * Created by Hal on 15/4/26.
4  */
5 public class ApiManager {
6
7     private static final String ENDPOINT = "http://api.openweathermap.org/data/2.5";
8
9     /**
10      * 服务接口
11      */
12     private interface ApiManagerService {
13         @GET("/weather")
14         WeatherData getWeather(@Query("q") String place, @Query("units") String units);
15     }
16
17     private static final RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(ENDPOINT).setLogLevel(RestAdapter.LogLevel.FULL).build();
18
19     private static final ApiManagerService apiManager = restAdapter.create(ApiManagerService.class);
20
21     /**
22      * 将服务接口返回的数据,封装成{@link rx.Observable}
23      * @param city
24      * @return
25      */
26     public static Observable<WeatherData> getWeatherData(final String city) {
27         return Observable.create(new Observable.OnSubscribe<WeatherData>() {
28             @Override
29             public void call(Subscriber<? super WeatherData> subscriber) {
30                 //订阅者回调 onNext 和 onCompleted
31                 subscriber.onNext(apiManager.getWeather(city, "metric"));
32                 subscriber.onCompleted();
33             }
34         }).subscribeOn(Schedulers.io());
35     }
36 }

订阅者的回调有三个方法,onNext,onError,onCompleted
3、接口调用

1   /**
2          * 多个 city 请求
3          * map,flatMap 对 Observable进行变换
4          */
5         Observable.from(CITIES).flatMap(new Func1<String, Observable<WeatherData>>() {
6             @Override
7             public Observable<WeatherData> call(String s) {
8                 return ApiManager.getWeatherData(s);
9             }
10         }).subscribeOn(Schedulers.io())
11                 .observeOn(AndroidSchedulers.mainThread())
12                 .subscribe(/*onNext*/new Action1<WeatherData>() {
13                     @Override
14                     public void call(WeatherData weatherData) {
15                         Log.d(LOG_TAG, weatherData.toString());
16                     }
17                 }, /*onError*/new Action1<Throwable>() {
18                     @Override
19                     public void call(Throwable throwable) {
20
21                     }
22                 });
23
24         /**
25          * 单个 city 请求
26          */
27         ApiManager.getWeatherData(CITIES[0]).subscribeOn(Schedulers.io())
28                 .observeOn(AndroidSchedulers.mainThread())
29                 .subscribe(new Action1<WeatherData>() {
30                     @Override
31                     public void call(WeatherData weatherData) {
32                         Log.d(LOG_TAG, weatherData.toString());
33                         ((TextView) findViewById(R.id.text)).setText(weatherData.toString());
34                     }
35                 }, new Action1<Throwable>() {
36                     @Override
37                     public void call(Throwable throwable) {
38                         Log.e(LOG_TAG, throwable.getMessage(), throwable);
39                     }
40                 });
41
42         /**
43          * Android View 事件处理
44          */
45         ViewObservable.clicks(findViewById(R.id.text), false).subscribe(new Action1<OnClickEvent>() {
46             @Override
47             public void call(OnClickEvent onClickEvent) {
48
49             }
50         });

subscribeOn(Schedulers.io())与observeOn(AndroidSchedulers.mainThread())分别定义了这两个动作的线程。Android UI 更新需要在主线程。
4、retrofit 支持 rxjava 整合

1 /**
2      * 服务接口
3      */
4     private interface ApiManagerService {
5         @GET("/weather")
6         WeatherData getWeather(@Query("q") String place, @Query("units") String units);
7
8         /**
9          * retrofit 支持 rxjava 整合
10          * 这种方法适用于新接口
11          */
12         @GET("/weather")
13         Observable<WeatherData> getWeatherData(@Query("q") String place, @Query("units") String units);
14     }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日霄科技

感谢各位大佬,您鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值