Rxを使用して複数のオブザーバーを管理し、サービスへの接続を1つだけ開いたままにする方法は?

イゴールエスコドロ

私のアプリケーションでは、一部のアクティビティがサーバーから情報を取得するため、データを取得する前に、接続がすでに確立されていることを確認する必要があります。BehaviorSubjectを使用して、接続が確立されたときにサブスクライバーに通知し、アクティビティがデータをロードできるようにします。

問題は、同じフロー内の複数のアクティビティが同じ動作をすることです。APIconnect()では、onStart()disconnect()呼び出す必要onStopがありますが、ユーザーが接続を使用する別のアクティビティに移動した場合、接続を再作成する必要はありません。同じものを使用できます。

現時点では、次の方法で実装しています。

  • 呼び出すconnect()BehaviorSubject、呼び出し元のクラスからサブスクライブされるが返されます

  • メソッドdisconnect()では、にオブザーバーがいない場合にのみ実際に切断さBehaviorSubjectれ、応答を待機しているアクティビティがないことを示します。

  • 呼び出し側クラス、を呼び出す前にObservableを破棄する必要がありdisconnect()ます。そうしないと、メソッドhasObservers()は返されません。false

    @CheckResult
    @Override
    public BehaviorSubject<Boolean> connect() {
       if (!connectionManager.isConnected()) {
            connectionManager.connect(TIMEOUT);
       }
    
       return mSubject;
    }
    
    @Override
    public void disconnect() {
        if (connectionManager.isConnected() && !mSubject.hasObservers()){
            connectionManager.disconnect();
        }
    }
    

以前の実装では、これを実現するためにリスナーを使用していました。connect()が呼び出されるたびに、リスナーの配列に追加され、後で接続が確立されたときに1つずつ通知されるパラメーターとしてリスナーを受信する必要があります。

また、disconnect()呼び出されるたびに、リストから削除するパラメーターとしてリスナーを受け取る必要があります。connectionManager.disconnect()リスナーの配列が全く活動が応答を待っていないことを示す、nullの場合にのみ呼び出されます。

これを処理するためのより良い方法はありますか?

Pieter Herroelen

サブジェクトを作成する場所で、誰かがサブスクライブ/サブスクライブ解除したときに何が必要かを指定できます。

subject.doOnUnsubscribe(()-> {
  if(!subject.hasObservers()) {
    closeConnection();
  }
});
subject.doOnSubscribe(() -> {
  openConnectionIfNotOpen();
});

このように、あなたはdisconnect()電話を取り除くことができます、あなたはただ退会する必要があります

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数のユーザー名を使用した、同じユーザーによるサーバーまたは共有リソースへの複数の接続は許可されていません

分類Dev

ユーザーがサーバーへの接続を中止した場合(接続中に更新したり、ブラウザーを閉じたりするなど)、すべての機能(複数の非同期など)の実行を停止する方法

分類Dev

IBM MQ-複数の接続名を使用してキュー・マネージャーに接続する方法(1つはフェイルオーバー)

分類Dev

ng:1つの要素に複数のテンプレートバインディングを含めることはできません。templateという名前または接頭辞*が付いた属性を1つだけ使用してください

分類Dev

Pythonサブプロセスを使用してvlcで開いたビデオに複数のオーディオストリームを追加する方法

分類Dev

クラスタリング(NDBClusterまたはGalera)を使用している場合、nodejsアプリはどのようにしてフェイルオーバーMySQLサーバーの1つに接続できますか?

分類Dev

Go:SMTPサーバーに接続し、1つの接続で複数のメールを送信しますか?

分類Dev

RXは複数のオブザーバブルをマージします

分類Dev

TLSクライアントが接続しているホスト名を見つける方法|| だった:CDNによって提供される情報の元のサービスプロバイダーを見つける方法は?

分類Dev

Retrofitを使用してRESTWebサービスを利用するためのシンプルなAndroidクライアント-「サーバーへの接続に失敗しました」というエラーが表示されるのはなぜですか

分類Dev

1つのサーバーを使用してマルチブルホストを設定し、ホットスポットまたは[Webなし]で接続されたデバイスに表示する方法

分類Dev

RX演算子を構築して、キーと値のペアの1つのオブザーバブルを複数のオブザーバブルに分割します(個別のキーごとに1つ)

分類Dev

ライブデータオブザーバーは一度だけ呼び出しました。UIを更新するためにAPIが再度呼び出されたときにサーバーからのデータを更新していません

分類Dev

PHPで静的メソッドを使用してデータベースへの接続を作成すると、1つまたは複数の接続になりますか?

分類Dev

Twitterは複数のアコーディオンをブートストラップしますが、一度に開いているパネルは1つだけです

分類Dev

接続が閉じられました:Mongooseを使用して同じMongoDBサーバーに接続している複数のノードアプリ

分類Dev

Crystal Reportsは、データベースサーバーへの接続を常に開いています

分類Dev

Crystal Reportsは、データベースサーバーへの接続を常に開いています

分類Dev

1つのオブザーバブルで複数のサブスクリプションをどのように行いましたか

分類Dev

AWSXrayを使用して複数のラムダとSQSにまたがるトレースを接続する方法

分類Dev

複数のサーバーにSSHで接続し、ファイルを1つにマージします

分類Dev

たぶんEmitterは一度だけ動作しますが、オブザーバーにサブスクライブした後、データを送信し続けるにはどうすればよいですか?

分類Dev

1つの80ポートを使用して1つの入力で複数のポートを使用してサービスを公開する方法

分類Dev

Swift:CFStreamCreatePairWithSocketToHost関数を使用してサーバーへの接続を開くことが失敗しました。どうすれば修正できますか?

分類Dev

マルチスレッドサーバーは、複数のクライアントが接続しようとすると、「破棄されたオブジェクトにアクセスできません」というエラーを表示します

分類Dev

Plots.jlのpyplotを使用します。複数のサブプロットにコロバーが1つしかないようにする方法は?

分類Dev

サードパーティサービスへの接続をリクエスト間で開いたままにします

分類Dev

複数のデバイスが接続されている場合、複数のデバイスへのシェルスクリプトを使用してブートローダーを再起動するとハングします

分類Dev

httpsサーバーのPythonベースは、応答を提供した後に接続を閉じています

Related 関連記事

  1. 1

    複数のユーザー名を使用した、同じユーザーによるサーバーまたは共有リソースへの複数の接続は許可されていません

  2. 2

    ユーザーがサーバーへの接続を中止した場合(接続中に更新したり、ブラウザーを閉じたりするなど)、すべての機能(複数の非同期など)の実行を停止する方法

  3. 3

    IBM MQ-複数の接続名を使用してキュー・マネージャーに接続する方法(1つはフェイルオーバー)

  4. 4

    ng:1つの要素に複数のテンプレートバインディングを含めることはできません。templateという名前または接頭辞*が付いた属性を1つだけ使用してください

  5. 5

    Pythonサブプロセスを使用してvlcで開いたビデオに複数のオーディオストリームを追加する方法

  6. 6

    クラスタリング(NDBClusterまたはGalera)を使用している場合、nodejsアプリはどのようにしてフェイルオーバーMySQLサーバーの1つに接続できますか?

  7. 7

    Go:SMTPサーバーに接続し、1つの接続で複数のメールを送信しますか?

  8. 8

    RXは複数のオブザーバブルをマージします

  9. 9

    TLSクライアントが接続しているホスト名を見つける方法|| だった:CDNによって提供される情報の元のサービスプロバイダーを見つける方法は?

  10. 10

    Retrofitを使用してRESTWebサービスを利用するためのシンプルなAndroidクライアント-「サーバーへの接続に失敗しました」というエラーが表示されるのはなぜですか

  11. 11

    1つのサーバーを使用してマルチブルホストを設定し、ホットスポットまたは[Webなし]で接続されたデバイスに表示する方法

  12. 12

    RX演算子を構築して、キーと値のペアの1つのオブザーバブルを複数のオブザーバブルに分割します(個別のキーごとに1つ)

  13. 13

    ライブデータオブザーバーは一度だけ呼び出しました。UIを更新するためにAPIが再度呼び出されたときにサーバーからのデータを更新していません

  14. 14

    PHPで静的メソッドを使用してデータベースへの接続を作成すると、1つまたは複数の接続になりますか?

  15. 15

    Twitterは複数のアコーディオンをブートストラップしますが、一度に開いているパネルは1つだけです

  16. 16

    接続が閉じられました:Mongooseを使用して同じMongoDBサーバーに接続している複数のノードアプリ

  17. 17

    Crystal Reportsは、データベースサーバーへの接続を常に開いています

  18. 18

    Crystal Reportsは、データベースサーバーへの接続を常に開いています

  19. 19

    1つのオブザーバブルで複数のサブスクリプションをどのように行いましたか

  20. 20

    AWSXrayを使用して複数のラムダとSQSにまたがるトレースを接続する方法

  21. 21

    複数のサーバーにSSHで接続し、ファイルを1つにマージします

  22. 22

    たぶんEmitterは一度だけ動作しますが、オブザーバーにサブスクライブした後、データを送信し続けるにはどうすればよいですか?

  23. 23

    1つの80ポートを使用して1つの入力で複数のポートを使用してサービスを公開する方法

  24. 24

    Swift:CFStreamCreatePairWithSocketToHost関数を使用してサーバーへの接続を開くことが失敗しました。どうすれば修正できますか?

  25. 25

    マルチスレッドサーバーは、複数のクライアントが接続しようとすると、「破棄されたオブジェクトにアクセスできません」というエラーを表示します

  26. 26

    Plots.jlのpyplotを使用します。複数のサブプロットにコロバーが1つしかないようにする方法は?

  27. 27

    サードパーティサービスへの接続をリクエスト間で開いたままにします

  28. 28

    複数のデバイスが接続されている場合、複数のデバイスへのシェルスクリプトを使用してブートローダーを再起動するとハングします

  29. 29

    httpsサーバーのPythonベースは、応答を提供した後に接続を閉じています

ホットタグ

アーカイブ