2017-02-02 7 views
2

は、私は、次のシングルトンを有する:件名出力タイプを変更するにはどうすればよいですか?

public abstract class Store<Input, Output> { 
    private BehaviorSubject<Input> subject = BehaviorSubject.create(); 
    private Observable<Output> observable; //also a singleton 

    public final Subscription register(Subscriber<Output> subscriber) { 
     if (observable == null) { 
      observable = subject.compose(getTransformer()); //is this hot? 
     } 
     return observable.subscribe(subscriber); 
    } 

    public final void unregister(Subscription subscription) { //unregister } 

    //applies operators to the original stream to transform Input -> Output 
    protected abstract Observable.Transformer<Input, Output> getTransformer(); 

    public final void onNext(Input event) { subject.onNext(event);} 
} 

問題:デバイスを回転させるか、アプリを観察ダイを最小限に抑える場合は、(ネットワークの実行を中止します)。 subject.compose()は冷たい観察可能なものを返しますか?もしそうなら、なぜですか?

publish.autoConnect()/share()を使ってみましたが、それは熱くなりましたが、回転しても死ぬことはありませんでしたが、BehaviourSubjectが壊れています。私はデバイスを回転させ、私はサブスクリプション時に最初の値を取得しません。

subjectの出力値を変換するにはどうすればsubjectとして動作するのですか? SAMPLE PROJECT

LOG:

USER:ヒットボタンネットワーク
Dから取得する:
ネットワークから取得中... D:メモリ
にキャッシュ:ネットワーク要求が正常に
Dを実行 USER:ヒットネットワークから再度取得するボタン
D:ネットワークから取得中...
USER:私は間違っている、すべてに沿って科目を使用してきた、.unsubscribe()

+0

map''のように、私がPRODで、このアプローチを使用していると私はこのことについて記事を書きましたその他。あなたの破損は、変圧器や 'onDestroy'で登録を解除する方法のように、質問に表示されていない何かが原因である可能性があります。 – akarnokd

+0

こんにちは@akarnokd、ここに私の変圧器がありますhttps://github.com/feresr/RxStore/blob/master/app/src/main/java/com/feresr/rxstore/JokesStore.java質問が更新されました。提供されたプロジェクト – feresr

+0

問題は科目とは関係ありませんが、アプリが一時停止したときにObservableを実行し続ける方法:http://blog.danlew.net/2017/01/16/the-activity-lifecycle-vs-the -world/ – akarnokd

答えて

0

が判明:押されたホームボタンは、アプリが
Dをバックグラウンドに。ここで私は上記の実装に何を望むかの正しいバージョンがあります:

public abstract class RxStore<Input, Output> { 
     private BehaviorRelay<Output> relay; 

     public final Subscription register(Subscriber<Output> subscriber) { 
      if (relay == null) { 
       relay = BehaviorRelay.create(defaultValue()); 
      } 
      return relay.subscribe(subscriber); 
     } 

     public final void unregister(Subscription subscription) { 
      if (subscription != null && !subscription.isUnsubscribed()) { 
       subscription.unsubscribe(); 
      } 
     } 

     public void execute(Input event) { 
      buildObservable(event).subscribe(relay); 
     } 

     /** 
     * @return the first or default value emitted to subscribers 
     */ 
     protected Output defaultValue() { 
      return null; 
     } 

     /** 
     * @return an buildObservable responsible of handling its own errors. 
     */ 
     protected abstract Observable<Output> buildObservable(Input event); 
    } 

編集:私はこのアプローチは非常に有用であることがわかりました

。 `、filter`との束をあなたはそれの温度を変更しない演算子を適用する

https://medium.com/@FerRaviola/rxandroid-an-event-bus-on-steroids-9699e93eca98#.tqbxleo4h

関連する問題