私のアプリケーションでは、一部のアクティビティがサーバーから情報を取得するため、データを取得する前に、接続がすでに確立されていることを確認する必要があります。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の場合にのみ呼び出されます。
これを処理するためのより良い方法はありますか?
サブジェクトを作成する場所で、誰かがサブスクライブ/サブスクライブ解除したときに何が必要かを指定できます。
subject.doOnUnsubscribe(()-> {
if(!subject.hasObservers()) {
closeConnection();
}
});
subject.doOnSubscribe(() -> {
openConnectionIfNotOpen();
});
このように、あなたはdisconnect()
電話を取り除くことができます、あなたはただ退会する必要があります
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加