RxJava 的使用入门

来源:互联网 发布:钱宝数据助手新手套餐 编辑:程序博客网 时间:2024/05/19 03:44

一、什么是 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 city24      * @return25      */26     public static Observable<WeatherData> getWeatherData(final String city) {27         return Observable.create(new Observable.OnSubscribe<WeatherData>() {28             @Override29             public void call(Subscriber<? super WeatherData> subscriber) {30                 //订阅者回调 onNext 和 onCompleted31                 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                     @Override14                     public void call(WeatherData weatherData) {15                         Log.d(LOG_TAG, weatherData.toString());16                     }17                 }, /*onError*/new Action1<Throwable>() {18                     @Override19                     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                     @Override31                     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                     @Override37                     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             @Override47             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     }
复制代码

 Demo 代码

 

--------EOF-----

0 0
原创粉丝点击