9. # Reactive Programming V2.0
Message-Driven
Responsive
Resilient
Elastic
参考manifesto
React to user
React to load data React to failure
React to
events & messages
15. ### Show Me The Code!
Observable.
just(1, 2, 3).
subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.print("-" + integer + "-");
}
});
Observable.just(1, 2, 3).subscribe{ print("-$it-") }
-1--2--3-
16. ### Show Me The Code!
Observable.just(1, 2, 3).
subscribe(
{ print("-$it-") },
{ println("-Error-X") },
{ println("-Complete-|")}
)
-1--2--3--Complete-|
17. ### Show Me The Code!
Observable.just(1, 2, 3).
doOnNext{
if (it == 3)
throw IllegalStateException("3 is not welcome!")
}.
doOnError{ print("-${it.getMessage()}-") }.
subscribe(
{ print("-$it-") },
{ println("-Error-X") },
{ println("-Complete-|")}
)
-1--2--3 is not welcome!--Error-X
26. ### Show Me The Code!
Tips: worker集并行任务管理与subscriber能力于一体
val worker = Schedulers.newThread().createWorker()
worker.schedule{
yourWork()
}
// some time later...
worker.unsubscribe()
27. ### Show Me The Code!
Tips: worker也可以将schedule任务的订阅状态解耦出来
val worker = Schedulers.newThread().createWorker()
val mySubscription = worker.schedule{
while(!worker.isUnsubscribed()) {
status = yourWork()
if(QUIT == status) { worker.unsubscribe()}
}
}
// some time later ...
mySubscription.unsubscribe()
28. ### Show Me The Code!
Tips: 递归/循环执行某任务, 直到取消订阅,
游戏循环绘制线程、socket读写线程等
worker.schedule(object : Action0 {
override fun call() {
yourDrawScreenWork()
// recurse until unsubscribed (schedule will do nothing if unsubscribed)
worker.schedule(this)
}
})
// some time later...
worker.unsubscribe();
64. ## 地板
public open class Ground {
val tile : Bitmap = getImage("tile")
val height = tile.getHeight()
val nrTiles = Math.ceil(screenWidth / tile.getWidth()) as Int + 1
fun onDraw(canvas : Canvas) = (0..nrTiles).map {
canvas.drawBitmap(tile, tile.getWidth() * it as Float, 0 as Float, paint)
}
}
65. ## 走起来
val v0 = 0
val s0 = 0
val acceleration = 3
deltaAcceleration(acceleration).
scan(v0) { vi, a-> vi + a }.
scan(s0) { si, vi-> si + vi }.
subscribe {
ground.setTranslateX(it)
}
Δa
vi = vi-1 + Δa·Δt
si = si-1 + vi · Δt