私は新しいデモアプリケーションに新しいMosby MVIライブラリを使用しています。 プレゼンターでインテントを定義するときに、ビューがアタッチされたときにインテントがトリガーされたり放出されたりすると、インテントが不一致になります。例えばMosby MVI:意図しないインテントバインディングの動作
:この意図は正常に動作します
@Override
protected void bindIntents() {
Observable<MailListViewState> loadData = intent(ExampleViewContract::intentLoadData).flatMap(interactor::loadData)
.observeOn(AndroidSchedulers.mainThread());
subscribeViewState(loadData, ExampleViewContract::render);
}
:さんは次のように発表者が意図的に結合する
public Observable<Boolean> intentLoadData(){
return Observable.just(true);
}
活動に非常に単純な意図を定義してみましょう。別のアクティビティ(詳細ビュー)にナビゲートして戻ると、bindIntents()
が呼び出され、インテントが再作成されます。 intentLoadData()
は新しいアイテムを発行せず、MviBasePresenterは内部のBehaviorSubjectを使用して以前のViewStateを提供します。
私の問題は:私はわずかに(データをリロードするための)インテントを調整します。ビューが再接続されると、インテントがアイテムを放出し始めます。
そうに意図を変更することができます:新しいアクティビティと背面に移動するとき
private PublishSubject<Boolean> mReloadDataSubject = PublishSubject.create();
private void reloadData(){
mReloadDataSubject.onNext(true);
}
public Observable<Boolean> intentLoadData(){
return mReloadDataSubject.startWith(true);
}
はありません。インテントは、ビューが再接続されたときに新しい項目を送出します。私の場合は、最後のViewStateを再利用するのではなく、データをリロードするためのバックエンドへの新しいAPU呼び出しが行われます。これは、reloadData()
が呼び出されない場合でも発生します。
この動作は非常に矛盾しています。ビューを再アタッチしているときにインテントがトリガーされたとき、どうすればコントロールできるのでしょうか?
更新:私にとって はさらに興味深いのは、再接続時に、私が観察を完了せず、意図の自動発光を避けるないか、です。 PublishSubjectの導入により、アクティビティは回転しているだけでもデータ全体をリロードします。
私の問題は逆です。 PublishSubjectを使用すると、後でインテントをトリガするのに役立ちますが、ビューを再接続するときに 'bindIntents()'でインテントが出ないようにするにはどうすればよいですか? – TobiasRe
「ビューを再接続する」とはどういう意味ですか?私に具体的な例を教えてもらえますか? – sockeqwe
私は元の質問のようにWebサービスからデータを読み込むためにPublishSubject定義を使用します。アクティビティが開始され、データがロードされます。 デバイスを回転させると、MviBasePresenterの 'bindIntentActually()'の実行中に再度ロードインテントがトリガされます。私はこの不必要な再読み込みを避けたいです。 この場合、 'viewAttachedFirstTime'setをfalseにして' attachIntentActually() 'を' attachView() 'で呼び出します。それは私が再接続を指している理由です。 – TobiasRe