常见的编程范式有命令式编程、函数式编程和逻辑式编程。比如,面向对象编程就是命令式编程。由于Android开发中,需要处理数据流式编程,因此,函数式编程是一个解决问题的好方案。在实际的开发中,常见的函数式响应式编程框架有RxJava和Agera。这里只说明RxJava。
- 首先,简单的使用示例。采用观察者模式。
- 创建观察者和被观察者
import android.app.Activity
import android.os.Bundle
import io.reactivex.Observer
import com.squareup.otto.Bus
import io.reactivex.Observable
import io.reactivex.disposables.Disposable
import org.reactivestreams.Subscriber
class MainActivity : Activity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
//观察者
val observer: Observer<String> = object :Observer<String>{
override fun onComplete() {
println("完成")
}
override fun onError(e: Throwable) {
println("错误")
}
override fun onNext(t: String) {
println("下一个$t")
}
override fun onSubscribe(d: Disposable) {
println("?")
}
}
//被观察者
v val observable:Observable<String> = Observable.create<String> {
it.onNext("养")
it.onNext("月")
it.onComplete()
}
//订阅
observable.subscribe(observer)
//另一个被观察者,直接通过just添加对象
val observable1:Observable<String> = Observable.just("金木研", "雏实")
//订阅
observable1.subscribe(observer)
//输出
//?
//下一个养
//下一个月
//完成
//?
//下一个金木研
//下一个雏实
//完成
}
}
可以看到调用的顺序是onSubscribe()->onNext()->onComplete()。另外,还可以通过别的方式添加被观察者。
val observable2:Observable<String> = Observable.fromArray("de", "dwq")
observable2.subscribe(observer)
- RxJava的Subject
相当于连接Observerable和Observer的桥梁。Subject可以被理解为Subject=Observable+Observer。RxJava提供了以下四种Subject。
- PublishSubject:只会把订阅发生的时间点之后来自原始Observable的数据发射给观察者。
- BehaviorSubject:订阅之后,开始发射原始Observable最近发射的数据。
- ReplaySubject:无论何时订阅ReplaySubject,均会发射所有来自原始数据Observable的数据给Observer。
- AsyncSubject:只会发射来自原始Observable的最后一个数据。
看不懂没关系。我也看不懂,用到再说。
3. 说一些操作符。
- interval每隔一段时间执行一个动作。
示例:
val observable2:Observable<Long> = Observable.interval(3, TimeUnit.SECONDS)
observable2.subscribe(Consumer {
println(it)
//输出
//1
//2
//...每隔三秒数字增加一,并输出
})
- range指定范围。range(0, 5)
- repeat 重复N次发射。一次完整发射结束后才会再次重复发射。类似:123 123,而不是112233。
- 变换操作符.
- map
- flatMap、cast
- concatMap
- flatMapIterable
- buffer
- groupBy
- 过滤操作符
- filter
- elementAt
- distinct
- skip、take
- ignoreElements
- throttleFirst
- 组合操作符
- startWith
- merge
- concat
- zip
- combineLastest
- 辅助操作符
- delay
- Do
- subscribeOn、observeOn
- timeout
- 错误处理操作符
- catch
- retry
- 条件操作符和布尔操作符
- all
- contains、isEmpty
- amb
- defaultIfEmpty
- 转换操作符
- toList
- toSortedList
- toMap
另外,RxJava结合Retrofit和OKHttp访问网络也是不错的选择。