基本構造
まず、最も基本的なコードを見て、このコードがRXJAVAでどのように実装されるかを分析しましょう。
Observable.Onsubscribe <String> onsubscribe1 = new Observsable.Onsubscribe <String>(){@Override public void call(subscriber <?super string> subscriber){subscriber.onnext( "1"); subscriber.oncompleted(); }}; subscriber <string> subscriber1 = new Subscriber <String>(){@Override public void oncompleted(){} @override public void onerror(throwable e){} @override public void onnext(string s){}}}; extervable.create(onsubcriber1);まず、Observable.createのコードを見てみましょう
public final static <t> oberverable <t> create(onsubscribe <t> f){return emw observable <t>(hook.oncreate(f));}保護された観測可能(onsubscribe <t> f){this.onsubscribe = f;}観察可能なコンストラクターを直接呼び出して、新しい観測可能なオブジェクトを作成します。このオブジェクトは、後のトレーサビリティのために一時的に観測可能1としてマークします。
同時に、私たちが渡したOnSubscribeオブジェクトは、Observable1のOnSubscribeプロパティに保存されます。このプロパティは、その後のコンテキストで非常に重要です。注意を払ってください。
次に、購読方法を見てみましょう。
Public final subscription subscribe(subscriber <?super t> subscriber){return observable.subscribe(subscriber、this);} private static <t> subscription subscribe(subscriber <?super t> super t> supercriber、Observable <t> oberverable){... subscriber.onstart(); hook.OnsubscribeStart(Observable、Observable.Onsubscribe).call(subscriber); return hook.onsubscribereturn(subscriber);}ご覧のとおり、購読後、Observable1.Onsubscribe.Callメソッドは直接呼び出されます。これは、コードのOnSubscribe1オブジェクトの呼び出しメソッドです。渡されたパラメーターは、コードで定義されているsubscriber1オブジェクトです。コールメソッドで行われるのは、着信subscriber1オブジェクトのonnextおよびoncompleteメソッドを呼び出すことです。
これにより、オブザーバーとオブザーバー間のコミュニケーションが可能になります。とても簡単ではありませんか?
public void Call(subscriber <?super string> subscriber){subscriber.onnext( "1"); subscriber.oncompleted();}rxjavaの使用シナリオの概要
1.最初にキャッシュされたシナリオを確認してください
データを取得し、最初にメモリにキャッシュがあるかどうかを確認し、ファイルキャッシュに以前の条件があるかどうかを確認します。最後に、ネットワークから次の条件が満たされます。
final observable <string> memory = observable.create(new Observable.Onsubscribe <String>(){@Override public void call(subscriber <?super string> subscriber){if(memorycache!= null){subscriber.onext(MemoryCache);} ols {subscribre.oncompreted(); Observable.create(new Observable.Onsubscribe <String>(){@Override public void call(subscriber <?super string> subscriber){string cachepref = rxpreferences.getString( "cache")。 subscriber.oncompleted(); Observable <String> Network = Observable.Just( "Network"); //主なことは、CONCATオペレーターに頼ってObservable.concat(Memory、disk、network).first()。 s);});2。更新する前に、複数のインターフェイスが同時にデータを収集するまでインターフェイスが待機する必要があります
// 2つの観測可能性の出力を分割すると、順序は保証されません。イベントの順序でサブスクライバーに送信private void testmerge(){Observable <string> Observable1 = demoutils.createobservable1()。 Observable <String> Observable2 = demoutils.createobservable2()。subscribeon(schedulers.newthread()); Observable.Merge(Observable1、Observable2).Subscribeon(Schedulers.NewThread()).Subscribe(System.out :: println);}3.あるインターフェイスの要求は、別のAPI要求によって返されるデータによって異なります。
たとえば、ログインする必要がある後、しばしば取得したトークンに基づいてメッセージリストを取得します。
ここでは、rxjavaがネストされたコールバックの問題を解決するために使用されます。コールバックヘルと呼ばれる固有名詞があります
networkservice.getToken( "username"、 "password").flatmap(s-> networkservice.getmessage(s)).subscribe(s-> {system.out.println( "message:" + s);});4.インターフェイスボタンは、連続的なクリックを防ぐ必要があります
rxview.clicks(findviewbyid(r.id.btn_throttle)).throttlefirst(1、timeunit.seconds).subscribe(esver-> {system.out.println( "click");});5。レスポンシブインターフェイス
たとえば、チェックボックスがチェックされ、対応する設定が自動的に更新されます。
SharedPreferences Preferences = PreferenceManager.getDefaultSharedPreferences(This); rxsharedPreferences rxpreferences = rxsharedpreferences.create(feartence); fearchenference <boolean> checked = rxpreferences.getBoolean( "チェック済み"、true);チェックボックスチェックボックス=(チェックボックス)(チェックボックス)(チェックボックス); findViewById(r.id.cb_test); rxcompoundbutton.checkedChanges(チェックボックス).subscribe(checked.asaction());
6。複雑なデータ変換
observable.just( "1"、 "2"、 "2"、 "3"、 "4"、 "5").map(integer :: parseint).filter(s -> s> 1).distinct().take(3).reduce((integer、integer2) - > integer.intvalue() + integer2.intgalue() + integer2.intgalue() .subscribe(system.out :: println); // 9