RxJava 的使用入门

原文地址为: 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 }

 Demo 代码

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


转载请注明本文地址: RxJava 的使用入门

猜你喜欢

转载自blog.csdn.net/linjcai/article/details/81034207
今日推荐