乐趣区

【Android】RxJava的使用(二)Action

回顾
在上一节 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) 的源码看看。还以为有多高深,原来就是把 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 详解(本文部分内容引用自该博客)

退出移动版