• 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-----

  • 相关阅读:
    Aboat join
    ajax 弹出层
    如何使用 BindingSource 绑定 ListBox,同时解决绑定 List<T> 后修改数据源不能同时刷新界面显示的问题
    Javascript 弹出层
    vs 2008 90 天 试用 破解
    c#的as类型转换详细理解,欢迎园友拍砖。
    Linux下定时切割Mongodb数据库日志并删除指定天数前的日志记录
    纠结了一天多的问题arithmetic overflow error converting expression to data type datetime
    关于开发Office2003AddIn问题
    为什么Scrum不行。。
  • 原文地址:https://www.cnblogs.com/halzhang/p/4458095.html
Copyright © 2020-2023  润新知