美文网首页安卓程序员TECH_ANDROID收藏夹
【Android】RxJava的使用(二)Action

【Android】RxJava的使用(二)Action

作者: 带心情去旅行 | 来源:发表于2016-05-20 01:10 被阅读10952次

回顾

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

        Observable.just("Hello", "World")
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.i(TAG, s);
                    }
                });

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

Action

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

        Observable.just("Hello", "World")
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.i(TAG, s);
                    }
                });

舒服多了有没有!!

  • 什么是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()。
        Observable observable = Observable.just("Hello", "World");
        //处理onNext()中的内容
        Action1<String> onNextAction = new Action1<String>() {
            @Override
            public void call(String s) {
                Log.i(TAG, s);
            }
        };
        //处理onError()中的内容
        Action1<Throwable> onErrorAction = new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {

            }
        };
        //处理onCompleted()中的内容
        Action0 onCompletedAction = new Action0() {
            @Override
            public void call() {
                Log.i(TAG, "Completed");

            }
        };

接下来使用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了。

  • 重新写打印"Hello"、" Wrod"的方法
        Observable.just("Hello", "Wrold").subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.i(TAG, s);
            }
        });

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

小结

Action的使用为我们减少了不必要的代码,使得写出的代码看上去更加得简洁。不过就目前来看RxJava还是没有什么优势值得我们去使用,下一篇我还会介绍更多RxJava的用法。慢慢得,你就会发现使用RxJava写出来的代码看上去真的很漂亮。
更多:
更多:
Android RxJava的使用(三)转换(map、flatMap)
Android RxJava的使用(四)线程控制 —— Scheduler

以上有错误之处感谢指出

参考:给 Android 开发者的 RxJava 详解
(本文部分内容引用自该博客)

相关文章

网友评论

  • 浅安流年:报告,发现单词错误。“Wrod"应该是“World”吧?:smile:
    浅安流年:@带心情去旅行 不客气,其实这个无关紧要,只是我有点强迫症,哈哈!
    带心情去旅行:@浅安流年 这就很尴尬了,谢谢你提醒哈
  • 一叶书生:指尖掺杂着浓浓的情谊,渐入佳境!
  • Alex_Code:very good!
  • asla:用的compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.2'
    没有Action()和Action1()是怎么回事,感觉好多方法都没有。
    带心情去旅行:@asla 我看了下文档,RxJava2用的是Consumer
    asla:是因为我导入的是RxJava2吗?Action1()是RxJava1中的?
    带心情去旅行:Action1是RxJava里面的接口,用来出来回调的
  • 月夜筱风_79d3:重新写打印"Hellow"、" Wrod"的方法,这处细节希望能改一下:flushed:
  • SmartSean:看了抛物线大神的讲解,再来看你的,有很多的相似之处,不知道是不是因为已经看了抛物线大神的,再看你的感觉写的很好,理解起来很容易,赞一个!
    带心情去旅行:@Coding_css 有部分内容来自抛物线大神,文中也有提到。我是看了他的文章后,结合自己的学习过程,写了这几篇
  • 泽贰:写的通俗易懂,循序渐进,非常适合入门 :+1:
  • logan676:public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError)

    从代码上看,subscribe方法第二个参数必须是Throwable。但是如果定义了应用自己的SomeException类(包含有code和message),如何把onError和SomeException关联呢?而且onError只有message信息,没有code信息,信息不全。求助?
  • 8b5e7c159a14:谢谢作者,明白了好多,非常感谢
  • 270a3815bc7d:心情好么?
    270a3815bc7d:@带心情去旅行 :smile:选择了远方,便只顾风雨兼程
    带心情去旅行:@Lizzza :smile: 旅行途中,饱含酸甜苦辣
  • 47779ff7f67a:我昨天刚刚网上看到那个详解,写的非常的通俗易懂,以前看了挺多的也不是特别理解,一看这个就懂了,谢谢分享

本文标题:【Android】RxJava的使用(二)Action

本文链接:https://www.haomeiwen.com/subject/bmwgrttx.html