つい最近、私は〜RxJavaおよび関連ソースコードのプレビュー情報と関連性の高いコンテンツやグラフィックスを終えた後、あなたはあなたが私に連絡することができます学ぶ必要がある、関連する教育のRXJavaのビデオを作りました
上記着手する:I RXjavaソースをし、このインタビューにあなたを与えた、とあなたは私が直面言うが、プランを取得することはできません()?
ソースと面接DaquanのPDFファイル
(VX:mm14525201314)
RxJava
RxJava
器具は、オブザーバーインターフェイスが加入することができることを目的は、クラスのインスタンスを観測(購読します)。観測(EMIT)応答を送信する任意のデータ又はシーケンス加入者(加入者)。このモデルは、それが観察送信データを待ってブロックしていないため、同時動作を簡素化しますが、スタンバイオブザーバ歩哨の通知を作成し、観察可能の将来応答のある時点で歩哨。
####シングル
入門
RxJava(およびその派生RxGroovy
とRxScala
)観測のシングルと呼ばれる変種があります。同様の観測単一、違いは、常にではなく一連の値を起動するよりも、唯一の値、又はエラー通知を発することです。
したがって、この方法とは異なり、3観測を必要とするonNext, onError, onCompleted
単一のサブスクリプションは2つの方法のみを必要とし、:
onSuccess
- このメソッド単一のシングルエミッション値onError
-あなたが希望する値を送信できない場合は、シングル起動Throwable
この方法の対象とします
シングルのみ、サブスクリプションの関係の終了これらの2つの方法のいずれか1つだけ呼び出し、任意のメソッドの呼び出しを呼び出した後
シングルオペレーター
シングルはまた、あなたが混在させることができるように、複数の操作、演算子のいくつかを組み合わせて、観察可能なシングルことができます。
主題
Subject可以看成是一个桥梁或者代理,在某些ReactiveX
实现中(如RxJava
),它同时充当了Observer
和Observable
的角色。因为它是一个Observer
,它可以订阅一个或多个Observable
;又因为它是一个Observable
,它可以转发它收到(Observe)的数据,也可以发射新的数据。
由于一个Subject
订阅一个Observable
,它可以触发这个Observable
开始发射数据(如果那个Observable
是"冷"的--就是说,它等待有订阅才开始发射数据)。因此有这样的效果,Subject可以把原来那个"冷"的Observable变成"热"的。
Subject的种类
针对不同的场景一共有四种类型的Subject。他们并不是在所有的实现中全部都存在,而且一些实现使用其它的命名约定(例如,在RxScala
中Subject被称作PublishSubject
)。
AsyncSubject
一个AsyncSubject只在原始Observable完成后,发射来自原始Observable的最后一个值。(如果原始Observable没有发射任何值,AsyncObject
也不发射任何值)它会把这最后一个值发射给任何后续的观察者。
然而,如果原始的Observable
因为发生了错误而终止,AsyncSubject
将不会发射任何数据,只是简单的向前传递这个错误通知
BehaviorSubject
当观察者订阅BehaviorSubject
时,它开始发射原始Observable最近发射的数据(如果此时还没有收到任何数据,它会发射一个默认值),然后继续发射其它任何来自原始Observable的数据。
然而,如果原始的Observable因为发生了一个错误而终止,BehaviorSubject
将不会发射任何数据,只是简单的向前传递这个错误通知
PublishSubject
PublishSubject
只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。需要注意的是,PublishSubject
可能会一创建完成就立刻开始发射数据(除非你可以阻止它发生),因此这里有一个风险:在Subject被创建后到有观察者订阅它之前这个时间段内,一个或多个数据可能会丢失。如果要确保来自原始Observable的所有数据都被分发,你需要这样做:或者使用Create创建那个Observable以便手动给它引入"冷"Observable的行为(当所有观察者都已经订阅时才开始发射数据),或者改用ReplaySubject
。
如果原始的Observable因为发生了一个错误而终止,PublishSubject
将不会发射任何数据,只是简单的向前传递这个错误通知。
ReplaySubject
ReplaySubject
会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。也有其它版本的ReplaySubject
,在重放缓存增长到一定大小的时候或过了一段时间后会丢弃旧的数据(原始Observable发射的)。
如果你把ReplaySubject
当作一个观察者使用,注意不要从多个线程中调用它的onNext
方法(包括其它的on系列方法),这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。
RxJava的对应类
假设你有一个Subject,你想把它传递给其它的代理或者暴露它的Subscriber接口,你可以调用它的asObservable
方法,这个方法返回一个Observable。具体使用方法可以参考Javadoc文档。
串行化
如果你把 Subject 当作一个 Subscriber 使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。
要避免此类问题,你可以将 Subject 转换为一个 SerializedSubject
,类似于这样:
mySafeSubject = new SerializedSubject( myUnsafeSubject );
调度器 Scheduler
如果你想给Observable操作符链添加多线程功能,你可以指定操作符(或者特定的Observable)在特定的调度器(Scheduler)上执行。
某些ReactiveX
的Observable操作符有一些变体,它们可以接受一个Scheduler参数。这个参数指定操作符将它们的部分或全部任务放在一个特定的调度器上执行。
使用ObserveOn
和SubscribeOn
操作符,你可以让Observable在一个特定的调度器上执行,ObserveOn
指示一个Observable在一个特定的调度器上调用观察者的onNext
, onError
和onCompleted
方法,SubscribeOn
更进一步,它指示Observable将全部的处理过程(包括发射数据和通知)放在特定的调度器上执行。
RxJava示例
调度器的种类
下表展示了RxJava中可用的调度器种类:
默认调度器
在RxJava中,某些Observable操作符的变体允许你设置用于操作执行的调度器,其它的则不在任何特定的调度器上执行,或者在一个指定的默认调度器上执行。下面的表格个列出了一些操作符的默认调度器:
使用调度器
除了将这些调度器传递给RxJava
的Observable
操作符,你也可以用它们调度你自己的任务。下面的示例展示了Scheduler.Worker
的用法:
worker = Schedulers.newThread().createWorker();
worker.schedule(new Action0() {
@Override
public void call() {
yourWork();
}
});
// some time later...
worker.unsubscribe();
递归调度器
再帰呼び出しをスケジュールするには、使用することができschedule
、その後、使用schedule(this)
例を:
worker = Schedulers.newThread().createWorker();
worker.schedule(new Action0() {
@Override
public void call() {
yourWork();
// recurse until unsubscribed (schedule will do nothing if unsubscribed)
worker.schedule(this);
}
});
// some time later...
worker.unsubscribe();
設定や配信停止の状態をチェック
対象労働者サブスクリプションクラスが実装するインタフェース、およびそれが退会方法をisUnsubscribed使用し、あなたのサブスクリプションや配信停止をキャンセルするタスクを停止することができますので、内部タスクからの例が予定されています。
Worker worker = Schedulers.newThread().createWorker();
Subscription mySubscription = worker.schedule(new Action0() {
@Override
public void call() {
while(!worker.isUnsubscribed()) {
status = yourWork();
if(QUIT == status) { worker.unsubscribe(); }
}
}
});
Worker
それと同時にSubscription
、あなたが(そして多くの場合、必要があります)その呼び出すことができますunsubscribe
保留中のタスクに気づくとリソースを解放することができます方法を。
そして、遅延期間スケジューラ
あなたが使用することができschedule(action,delayTime,timeUnit)
ますが、スケジューラで指定されたタスクを実行遅延を、次の例のタスクが500ミリ秒後に開始されます:
someScheduler.schedule(someAction, 500, TimeUnit.MILLISECONDS);
他のバージョンの使用schedule,schedulePeriodically(action,initialDelay,period,timeUnit)
は、次のタスクの例では、500ミリ秒後に行われ、その後、250ミリ秒ごとに実行され、定期的に実行するタスクをスケジュールすることができるようにする方法を:
someScheduler.schedulePeriodically(someAction, 500, 250, TimeUnit.MILLISECONDS);
テストスケジューラ
TestScheduler手動で微調整スケジューラクロックのパフォーマンスをできるように。このテストでは、便利なタスクの正確なタイミングに依存しています。スケジューラは、三つの追加メソッドがあります。
advanceTimeTo(time,unit)
指定した時点へのクロック前方変動スケジューラadvanceTimeBy(time,unit)
特定の期間トグル前方スケジューラクロックtriggerActions( )
クロック時間には早くも彼らの計画に等しいか、スケジューラ、現在の時刻である場合は、任意のタスク計画が、開始されていないを開始する前に
(プル左GitHubのリンク、あなたは自分自身を見つけることができるなどのインタビューなど、関連するコンテンツへのアクセスを必要とします)
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)