2017-04-24 16 views
1

rxJavaを使用しているときに問題があります。私はユースケースを2回実行する必要がありますが、異なるパラメータを使用し、各変数に応答を追加します。問題は、2つ目の変数が2番目に実行する前に値を持っているということです。ユーズケースですが、理由はわかりません。 getCompaniesReturn複数のサブスクライバを実行するrxjava

宣言変数を実行する前に>departureTrip(値応答を有する)が、returnTripは値を有するが、 - 問題の終わりに

回答

GetCompanies実行します

private GetCompanies getCompanies; 
private GetCompanies getCompaniesReturn; 
private SearchResponseDomain departureTrip; 
private SearchResponseDomain returnTrip; 

実行

getCompanies.execute(new CompaniesObserver()); 
getCompaniesReturn.execute(new CompaniesTravelDoubleObserver()); 

GetCompanies

public class GetCompanies extends UseCase { 

    private final AppRepository repository; 
    private String origin; 
    private String destination; 
    private String date; 
    private String passengers; 

    @Inject 
    public GetCompanies(AppRepository repository) { 
     this.repository = repository; 
    } 

    @Override 
    protected Observable buildObservableUseCase() { 
     return this.repository.getAllResultsSearch(origin, destination, date, passengers); 
    } 
} 

ユースケース

public abstract class UseCase { 


    private Subscription subscription = Subscriptions.empty(); 

    protected UseCase() { 
    } 

    @SuppressWarnings("unchecked") 
    public void execute(Subscriber UseCaseSubscriber) { 
     this.subscription = this.buildObservableUseCase() 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(Schedulers.io()) 
       .subscribe(UseCaseSubscriber); 
    } 

    /** 
    * Unsubscribes from current {@link rx.Subscription}. 
    */ 
    public void unsubscribe() { 
     if (!subscription.isUnsubscribed()) { 
      subscription.unsubscribe(); 
     } 
    } 

    protected abstract Observable buildObservableUseCase(); 
} 

コードの実行getCompanies

private final class CompaniesObserver extends 
    DefaultSubscriber<SearchResponseDomain> { 
    @Override 
    public void onCompleted() { 
     combineResults(departureTrip,returnTrip); 
    } 

    @Override 
    public void onError(Throwable e) { 
     super.onError(e); 
    } 

    @Override 
    public void onNext(SearchResponseDomain searchResponseDomain) { 
     super.onNext(searchResponseDomain); 
     departureTrip = searchMapper.reverseMap(searchResponseDomain); 
    } 
} 

コードの実行CompaniesTravelDoubleObserver

private final class CompaniesTravelDoubleObserver extends 
    DefaultSubscriber<SearchResponseDomain> { 
    @Override 
    public void onCompleted() { 
     super.onCompleted(); 
     combineResults(departureTrip,returnTrip); 
    } 

    @Override 
    public void onError(Throwable e) { 
     super.onError(e); 
    } 

    @Override 
    public void onNext(SearchResponseDomain searchResponseDomain) { 
     super.onNext(searchResponseDomain); 
     returnTrip = searchMapper.reverseMap(searchResponseDomain); 
    } 
} 

メソッド検証データは

public void combineResults(SearchResponsePresentation departureTrip,SearchResponsePresentation returnTrip){ 

     if(departureTrip != null && returnTrip != null){ 
      getView().hideLoading(); 
      getView().showCompanies(departureTrip,returnTrip); 
     } 
    } 

ソリューション

を完了します読み取り後の

とポストとdiscutionsを読んで、私は助けを借りて解決ユーザー@Hansソーセージ

1を発見した - 私は問題を抱えている、私がアクセス、観察を持っていないと私はプレゼンターに

を購読する必要があります

GetCompanies

public class GetCompanies //extends UseCase { 
{ 
    private final AppRepository repository; 
    private String origin; 
    private String destination; 
    private String date; 
    private String passengers; 

    @Inject 
    public GetCompanies(AppRepository repository) { 
     this.repository = repository; 
    } 

    //@Override 
    public Observable buildObservableUseCase() { 
     return this.repository.getAllResultsSearch(origin, destination, date, passengers); 
    } 


    public void setOrigin(String origin) { 
     this.origin = origin; 
    } 

    public void setDestination(String destination) { 
     this.destination = destination; 
    } 

    public void setDate(String date) { 
     this.date = date; 
    } 

    public void setPassengers(String passengers) { 
     this.passengers = passengers; 
    } 
} 

プレゼンター

Observable<SearchResponseDomain> departureTrip = getCompanies.buildObservableUseCase().subscribeOn(Schedulers.io()); 
      Observable<SearchResponseDomain> returnTrip  = getCompaniesReturn.buildObservableUseCase().subscribeOn(Schedulers.io()); 
      // Subs. to both observables. If one finishes -> whole stream closes 
      Observable<List<SearchResponseDomain>> zip = Observable.zip(departureTrip, returnTrip, (d, r) -> { 
       return Arrays.asList(d, r); 
      }); 
      // Subscribe 
      zip.observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new CompaniesTravelDoubleObserver()); 

    //------------------------------------------------------------// 
private final class CompaniesTravelDoubleObserver extends 
DefaultSubscriber<List<SearchResponseDomain>> { 
    @Override 
    public void onCompleted() { 
     getView().hideLoading(); 

    } 
    @Override 
    public void onError(Throwable e) { 
     getView().hideLoading(); 
     networkError.setError(e); 
     getView().hideLoading(); 
     getView().showError(networkError.getAppErrorMessage()); 
    } 

    @Override 
    public void onNext(List<SearchResponseDomain> searchResponseDomains) { 
     getView().showCompanies(searchMapper.reverseMap(searchResponseDomains)); 

    } 
} 
+0

質問は少し不明です、あなたは2つの変数とは何かを説明することができますか?同じ値ですか? –

+0

これはあなたのやり方ではありません。継承よりも機能的な構成を使用します。あなたがしようとしていることをもう少し詳しく教えてください。多分あなたに別のアプローチがあります。 –

+0

@HansWurst私は詳細を追加します –

答えて

1

私は質問に答えます: * 2つの異なるgetCompanyリクエストがあります。両方のリクエストがある場合(どちらも1つの値を返す - >単一の場合)、結果はUIに表示する必要があります。

ジップオペレータは、あるストリームの各値を他のストリームの値と結合します。

ほとんどの場合、観測者を作成する必要があります。登録する場所はごくわずかにする必要があります。

@Test 
public void name() throws Exception { 
    Observable<SearchResponseDomain> departureTrip = getCompanies(); 
    Observable<SearchResponseDomain> returnTrip = getCompanies(); 

    // Subs. to both observables. If one finishes -> whole stream closes 
    Observable<List<SearchResponseDomain>> zip = Observable.zip(departureTrip, returnTrip, (d, r) -> { 
     return Arrays.asList(d, r); 
    }); 

    // Subscribe 
    zip.observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(searchResponseDomain -> { 
       // show stuff in UI 
      }); 

} 

// TODO: add params to getCompanies... 
private Observable<SearchResponseDomain> getCompanies() { 
    return Observable.just(new SearchResponseDomain()); 
} 

class SearchResponseDomain { 

} 

私は上記のコードからあなたの意図をキャプチャしたいと思います。あなたがきれいなUI体験をしたいなら、Jake Whartonのこのプレゼンテーションを見てください:https://speakerdeck.com/jakewharton/the-state-of-managing-state-with-rxjava-devoxx-us-2017

+0

しかし、getCompaniesはObservableを返しません。私のユースケースクラスがObservableに直接アクセスできるようにしていないためです。 –

+0

戻り型のgetCompaniesは無効ですか?なぜbuildObservableUseCase()を使用しないのですか? –

+0

申し訳ありませんでした。 Thanks !!!、 –

関連する問題