1

Observable の戻り値の型を持つ Retrofit を使用して、Activity でログイン サービスを適切に処理しています。

mApiService.login(new LoginRequest("username", "password"))
    .observeOn(Schedulers.io())
    .subscribeOn(AndroidSchedulers.mainThread())
    .doOnNext(loginObjectResponse -> /* write to disk */ )
    .flatmap(loginObjectResponse -> /* manipulate */)
    .subscribe(loginObjectResponse -> /* update UI */, e -> /* update UI */);

私がやりたいことは、doOnNext と flatmap のロジックを別のクラスに引き出し、最終的に Activity を次のように単純化することです。

mManager.login("username", "password")
    .observeOn(Schedulers.io())
    .subscribeOn(AndroidSchedulers.mainThread())
    .subscribe(booleanResult -> /* update UI */, e -> /* update UI */);

そして、マネージャー クラスで API サービス呼び出しを処理します。

これを達成するための最善の方法についてアドバイスを求めています。マネージャー クラスが Observable を返すようにしたいのは明らかですが、Retrofit Observable を使い続ける (そしてサブスクリプションをラップする) ことはできますか? それとも、もう少し同期させて、単純な Observable を作成して返すほうがよいのでしょうか?

アップデート

マネージャー クラスでオペレーション チェーンを構築し、Activity でサブスクリプション時にすべて実行できるようにすることで、これとは異なるアプローチを考えさせられるサンプルをいくつか見つけました。私のマネージャーメソッドは defer を使用するようになり、次のようになります。

public Observable login(String username, String password) {
    return Observable.defer(() ->
        mApiService.login(new LoginRequest(username, password))
            .doOnNext(loginResponse -> /* write to disk */ )
            .flatMap(loginResponse -> return Observable.just(loginResponse); )
        );
}

上記のように私のアクティビティをサブスクライブします。

私が球場にいるかどうかの洞察、またはこのユースケースをより適切に処理する方法についてのアドバイスを期待しています。ありがとう!

UPDATE2

したがって、延期はここでは何の役にも立ちません。ログイン方法は次のように要約されます。

public Observable login(String username, String password) {
    return mApiService.login(new LoginRequest(username, password))
        .doOnNext(loginResponse -> /* write to disk */ )
        .flatMap(loginResponse -> return Observable.just(loginResponse); )
    );
}

このアプローチに対するコメント/改善を歓迎します。私が遭遇したほとんどの例は、サブスクリプションが行われる場所ですべてを実行します。

4

0 に答える 0