【Android】RxJava的使用(二)Action

回顾

在上一节Android RxJava的使用(一)基本用法中,介绍了RxJava的基本用法。下面来回顾下实现一次RxJava的基本使用。
例:分别打印"Hellow"、" Wrod"

 1 Observable.just("Hello", "World")
 2                 .subscribe(new Subscriber<String>() {
 3                     @Override
 4                     public void onCompleted() {
 5 
 6                     }
 7 
 8                     @Override
 9                     public void onError(Throwable e) {
10 
11                     }
12 
13                     @Override
14                     public void onNext(String s) {
15                         Log.i(TAG, s);
16                     }
17                 });

 

可以看到,我们这里只用了onNext(obj),还有两个重写的onError(error)和onCompleted()并没有用到,这样导致我们多出了几行根本用不到的代码。于是就想能不能只写我们使用到的,其他几个没用到的就不写,这样的代码看着才舒服。接下来就是使用本次的主角Action来代替Subscriber

Action

上部分的代码使用Action来代替Subscriber得到的代码是这样的:

1 Observable.just("Hello", "World")
2                 .subscribe(new Action1<String>() {
3                     @Override
4                     public void call(String s) {
5                         Log.i(TAG, s);
6                     }
7                 });

舒服多了有没有!!

  • 什么是Action
    Action是RxJava 的一个接口,常用的有Action0和Action1。

    Action0: 它只有一个方法 call(),这个方法是无参无返回值的;由于 onCompleted() 方法也是无参无返回值的,因此 Action0 可以被当成一个包装对象,将 onCompleted() 的内容打包起来将自己作为一个参数传入 subscribe() 以实现不完整定义的回调。
    Ation1:它同样只有一个方法 call(T param),这个方法也无返回值,但有一个参数;与 Action0 同理,由于 onNext(T obj) 和 onError(Throwable error) 也是单参数无返回值的,因此 Action1 可以将 onNext(obj)和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调

  • Action的使用
    定义三个对象,分别打包onNext(obj)、onError(error) 、onCompleted()。

     1 Observable observable = Observable.just("Hello", "World");
     2       //处理onNext()中的内容
     3       Action1<String> onNextAction = new Action1<String>() {
     4           @Override
     5           public void call(String s) {
     6               Log.i(TAG, s);
     7           }
     8       };
     9       //处理onError()中的内容
    10       Action1<Throwable> onErrorAction = new Action1<Throwable>() {
    11           @Override
    12           public void call(Throwable throwable) {
    13 
    14           }
    15       };
    16       //处理onCompleted()中的内容
    17       Action0 onCompletedAction = new Action0() {
    18           @Override
    19           public void call() {
    20               Log.i(TAG, "Completed");
    21 
    22           }
    23       };

    接下来使用subscribe重载的方法

    //使用 onNextAction 来定义 onNext()
    Observable.just("Hello", "World").subscribe(onNextAction);
    //使用 onNextAction 和 onErrorAction 来定义 onNext() 和 onError()
    Observable.just("Hello", "World").subscribe(onNextAction, onErrorAction);
    //使用 onNextAction、 onErrorAction 和 onCompletedAction 来定义 onNext()、 onError() 和 onCompleted()
    Observable.just("Hello", "World").subscribe(onNextAction, onErrorAction, onCompletedAction);

    根据实际情况使用以上的方法处理onNext(obj)、onError(error) 、onCompleted()的回调。
    现在有个疑问,为什么使用Action也能达到使用Subscriber的结果?进subscribe(Action1 onNext)的源码看看。


    RxJava源码


    还以为有多高深,原来就是把Action对象转化成对应的Subscriber对象了。这样就不难理解为什么可以使用Action来代替Subscriber了。

  • 重新写打印"Hellow"、" Wrod"的方法

    1 Observable.just("Hellow", "Wrold").subscribe(new Action1<String>() {
    2           @Override
    3           public void call(String s) {
    4               Log.i(TAG, s);
    5           }
    6       });

     

    相比第一篇那冗长的代码,现在感觉怎么样?还是觉得代码多?确实,如果只是打印几个字符串确实还是略微复杂。不急,RxJava还有其他功能呢。

小结

Action的使用为我们减少了不必要的代码,使得写出的代码看上去更加得简洁。不过就目前来看RxJava还是没有什么优势值得我们去使用,下一篇我还会介绍更多RxJava的用法。慢慢得,你就会发现使用RxJava写出来的代码看上去真的很漂亮。

posted @ 2017-03-20 09:25  火龙裸先生  阅读(662)  评论(0编辑  收藏  举报