-1

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ます。

そのようなオブザーバブルを構築するにはどうすればよいですか?

そうでない場合は、コメントで教えてください。

4

1 に答える 1

0

Observable のサブクラス化はトリッキーです。被写体を「架け橋」として構図を使用する方が簡単なはずです。何かのようなもの

public class HelperClass {

    private Subscription bridgeSubscription;
    private ReplaySubject<MyData> bridgeSubject;
    private MyService service;
    private Subscriber<MyData> mSubscriber = new Subscriber<MyData>() {
                @Override
                public void onCompleted() {
                  // To DO
                }

                @Override
                public void onError(Throwable e) {
                  // TO DO
                }

                @Override
                public void onNext(MyData d) {
                    bridgeSubject.onNext(d);
                }
            };
    public HelperClass(MyService service) {
        this.service = service;
        bridgeSubject = ReplaySubject.create(1);
        bridgeSubscription = this.service.httpCall().publish().autoConnect().subscribe(mSubscriber);
    }

    public Observable<MyData> getObservable() {
        // Might not work too well to hide the observable identity  
        // return bridgeSubject.asObservable();
        return bridgeSubject;
    }

    public void triggerRefresh() {
        if (bridgeSubscription != null) {
            bridgeSubscription.unsubscribe();
            bridgeSubscription = null;
        }
        bridgeSubscription = service.httpCall().publish().autoConnect().subscribe(mSubscriber);
    }
}
于 2016-04-06T16:34:44.923 に答える