【Android TimeCat】 RxJava的使用(二)Action
回顾
例:分别打印”Hello”、” World”1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Observable.just("Hello", "World")
.subscribe(new Subscriber<String>() {
public void onCompleted() {
}
public void onError(Throwable e) {
}
public void onNext(String s) {
Log.i(TAG, s);
}
});
可以看到,我们这里只用了onNext(obj)
,还有两个重写的onError(error)
和onCompleted()
并没有用到,这样导致我们多出了几行根本用不到的代码。于是就想能不能只写我们使用到的,其他几个没用到的就不写,这样的代码看着才舒服。接下来就是使用本次的主角Action
来代替Subscriber
Action
上部分的代码使用Action来代替Subscriber得到的代码是这样的:1
2
3
4
5
6
7Observable.just("Hello", "World")
.subscribe(new Action1<String>() {
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()
。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Observable observable = Observable.just("Hello", "World");
//处理onNext()中的内容
Action1<String> onNextAction = new Action1<String>() {
public void call(String s) {
Log.i(TAG, s);
}
};
//处理onError()中的内容
Action1<Throwable> onErrorAction = new Action1<Throwable>() {
public void call(Throwable throwable) {
}
};
//处理onCompleted()中的内容
Action0 onCompletedAction = new Action0() {
public void call() {
Log.i(TAG, "Completed");
}
};
接下来使用subscribe
重载的方法1
2
3
4
5
6//使用 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)
的源码看看。
还以为有多高深,原来就是把Action
对象转化成对应的Subscriber
对象了。这样就不难理解为什么可以使用Action
来代替Subscriber
了。
重写打印”Hello”、” Wrod”的方法
1 | Observable.just("Hello", "Wrold").subscribe(new Action1<String>() { |
相比第一篇那冗长的代码,现在感觉怎么样?还是觉得代码多?确实,如果只是打印几个字符串确实还是略微复杂。不急,RxJava还有其他功能呢。
小结
Action
的使用为我们减少了不必要的代码,使得写出的代码看上去更加得简洁。不过就目前来看RxJava
还是没有什么优势值得我们去使用,下一篇我还会介绍更多RxJava
的用法。慢慢得,你就会发现使用RxJava
写出来的代码看上去真的很漂亮。
参考
https://www.jianshu.com/p/c7a995f3763c
http://gank.io/post/560e15be2dca930e00da1083