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));
}
}
質問は少し不明です、あなたは2つの変数とは何かを説明することができますか?同じ値ですか? –
これはあなたのやり方ではありません。継承よりも機能的な構成を使用します。あなたがしようとしていることをもう少し詳しく教えてください。多分あなたに別のアプローチがあります。 –
@HansWurst私は詳細を追加します –