2017-02-20 25 views
0

リアクティブJavaでは、.subscribe()呼び出しが「サブスクリプションリファレンス」を返すと言われています。しかし、Subscriptionは、のインタフェースであり、クラスではありません。それで、私たちが渡したオブジェクトの種類は、このインタフェースを実装していますか?私たちはこれを支配していますか?リアクティブJavaサブスクリプションはどのような種類のオブジェクトですか?

Subscriptionsがあり、いくつかの異なる種類のSubscriptionを作成して返すことができますが、それらは何をしますか?私が書く場合

Subscription mSub = Subscriptions.create(<some Action0>); 
mSub = someObservable.subscribe(); 

は私だけで作成したSubscriptionは、単に何でも.subscribe()呼び出しが戻っによって上書きされないのだろうか?作成するSubscriptionはどのように使用しますか?

(多少の関連ノートで、それはすでに解除されて、何もしません退会する購読を返す」Subscriptions.unsubscribed()のポイントは、何です。え?)

答えて

2

短い答え:あなたが気にしてはいけません。

長い答えは:

  • unsubscribe()、サブスクリプションが終了します:サブスクリプションは、次の2つのメソッドを提供します。
  • isUnsubscribed()。これは、すでに発生しているかどうかを確認します。

これらのメソッドをa)Observableチェーンが終了したかどうかをチェックし、b)ユーザが別のアクティビティに切り替えた場合など、途中で終了させることができます。

これだけです。あなたはの目的での内部にさらされていません。また、resubscribeメソッドはありません。これは、操作を再開したい場合はObservableに再登録し、新しいSubscriptionを与える必要があるからです。

やや関連ノートで
1

あなたはSubscription sはに使用されている知っているようにAndroidアプリケーションでは、Activity(画面)を変更すると古いActivityObservable秒がフラッシュされます。このシナリオでは、Subscriptionインスタンスは.subscribe()(前述のとおり)で与えられ、したがって、いずれの理由で、Subscriptionを直接作成するか、特にSubscriptions.unsubscribed() ?私は2つのケースが発生しました:

  • デフォルト実装。後者が記入され、NPEを作成する可能性があるSubscription mSub;のような宣言は避けてください。プロパティーの初期化が必要なKotlinを使用する場合は特にそうです。

  • テスト

+0

ありがとうございます。質問:Androidアクティビティサブスクリプションを保存すると、アクティビティが再開されたときにオブザーバブルに再接続することができますか?あなたは例を挙げることができますか?作成したサブスクリプションをデフォルトの実装でどのように使用すればよいですか?私はAndroidアプリでいくつかのサブスクリプション(RxAndroidBle用)を宣言しましたが、問題はないようです。 –

+0

'Subscription'リファレンスを保存する主な用途は、後で' .dispose() 'を呼び出すことです。したがって、サブスクリプションを処理しない場合は、 'Subscription'リファレンスを削除し、' myObservable.subscribe(); 'を変数に代入せずに記述してください。典型的な使い方は 'onResume()'メソッドに登録し、 'Subscription'を格納し、' onPause() 'で' subscription.dispose(); 'を呼び出します。 –

0

、「それはすでに解除されて。えっ、何もしません退会する購読を返しSubscriptions.unsubscribed()、のポイントは何ですか?1で

。x、Subscriptions.unsubscribed()は、コントロールがRxJavaからコードに戻されたときに、操作が完了した(または最初に実行されない)Subscriptionインスタンスを返すために使用されます。登録解除されているのはステートレスで一定の状態なので、返されたSubscriptionはシンプルです。Subscriptionを見るだけで、完了/未登録の1つを別のものから区別することはできません。

2.xでは、対応するインターフェイスの公開バージョンと内部バージョンがDisposableです。内部バージョンはほとんどの場合、NullPointerExceptionと一般的なヌルチェックを避け、GCをいくらか助けて、終了したものと一緒にライブDisposableを交換するために採用されています。

どうしますか?

通常、あなたはSubscriptions.create()について心配する必要はありません。それはあなたがあなたのエンド加入者のライフサイクルにアタッチしたいリソースを持っている場合のために提供されています

FileReader file = new FileReader ("file.txt"); 

readLines(file) 
.map(line -> line.length()) 
.reduce(0, (a, b) -> a + b) 
.subscribe(new Subscriber<Integer>() { 
    { 
     add(Subscriptions.create(() -> { 
      Closeables.closeSilently(file); // utility from Guava 
     }); 
    } 
    @Override public void onNext(Integer) { 
     // process 
    } 
    // onError(), onCompleted() 
}); 

この例では、使用する1つの方法を実証し、代わりにそれにもかかわらずusingを介して発現することができます。

Observable.using(
    () -> new FileReader("file.txt"), // + try { } catch { } 
    file -> readLines(file).map(...).reduce(...), 
    file -> Closeables.closeSilently(file) 
) 
.subscribe(...) 
関連する問題