http 呼び出しの結果を多くのサブスクライバーと共有するために、リアクティブ プログラミングに依存しようとしています。同時に、コールを再度実行できるようにしたい (リフレッシュ)。
http 呼び出しを実行し、すぐに完了するコールド Observable から始めます。
私はそれをラップして、次のように機能するホットオブザーバブルを取得したいと考えています。すべてのサブスクライバーは、サブスクライブ時に常に最後のイベント (存在する場合) を受信し、サブスクライブが解除されるまで他のすべてのイベントを受信する必要があります。更新をトリガーし、すべてのサブスクライバーで新しいイベントをトリガーする方法 (そのオブザーバブルの外部) が必要です。
詳細:
によってビルドされた http リクエスト用のコールド Observable がありますretrofit2
。完全を期すために、これは私のサービスインターフェースです
@GET("/path")
Observable<MyData> httpCall();
サービスの改造を依頼します。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(REST_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
MyService service = retrofit.create(MyServiceInterface.class);
サービスからオブザーバブルを取得します。
Observable<MyData> coldObservable = service.httpCall();
これはコールドオブザーバブルであり、呼び出されるたびに http 呼び出しを実行しsubscribe()
、すぐに完了します。
ホットオブザーバブルを公開したいのですが、これを行うことができると読みました:
Observable<MyData>hotObservable = coldObservable.publish()
.autoConnect();
このようにして、最初に http 呼び出しが実行され、subscribe()
複数回サブスクライブすると、すべてが同じに「接続」されcoldObservable
ます。
呼び出しが完了した後、subscribe()
もう一度呼び出しても何も起こりません。完了へのコールバックもありません。
代わりに、最後のイベントを受け取りたいです。
ユーザーが要求した場合、強制的に更新したい (http 呼び出しを繰り返す)。すべてのサブスクライバーは、新しい結果/エラーを受け取る必要があります。
私は次のようなものを想像します:
Observable<MyData> theSmartObservable = helperClass.getObservable();
// at some point later
helperClass.triggerRefresh();
トリガーされた更新により、 で新しいイベントが生成されtheSmartObservable
ます。
そのようなオブザーバブルを構築するにはどうすればよいですか?
そうでない場合は、コメントで教えてください。