在 RxJava 上链接调用

Chaining Calls on RxJava

有些情况下我需要链接 RxJava 调用。

最简单的:

视图模型:

fun onResetPassword(email: String) {
    ...
    val subscription = mTokenRepository.resetPassword(email)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.io())
        .subscribe(
            //UI update calls
        )
    ...
}

我的存储库:

fun resetPassword(email: String): Single<ResetPassword> {
        return Single.create { emitter ->

            val subscription = mSomeApiInterface.resetPassword(email)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe({
                    emitter.onSuccess(...)
                }, { throwable ->
                    emitter.onError(throwable)
                })

            ...

        }
    }

我的问题

是否需要添加:

.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())

为了避免任何应用冻结?或者 API 调用的第二个是否足够?

不,您不需要添加

.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())

用于回购和视图模型。

.observeOn 通常应该在处理 ui 渲染之前调用。所以通常,在更新 ui 或发出 LiveData 值之前,您会在 ViewModel 中需要它。

此外,您不需要在您的回购协议中订阅 mSomeApiInterface,我认为最好只订阅 return,因为它来自您的链上链,诸如此类像这样:

fun resetPassword(email: String): Single<ResetPassword> {
        return mSomeApiInterface.resetPassword(email);
    }

如果您需要任何映射,您可以正常链接它

fun resetPassword(email: String): Single<ResetPassword> {
        return mSomeApiInterface.resetPassword(email)
                .map{it -> }
    }

这样你就可以编写你的 ViewModel 代码如下

fun onResetPassword(email: String) {
    ...
    // note the switcing between subscribeOn and observeOn
    // the switching is in short: subscribeOn affects the upstream,
    // while observeOn affects the downstream.
    // So we want to do the work on IO thread, then deliver results
    // back to the mainThread.
    val subscription = mTokenRepository.resetPassword(email)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            //UI update calls
        )
    ...
}

这将 运行 io 线程上的 API 请求,将 return 在 mainThread 上获取结果,这可能是您想要的。 :)

这个artical有一些关于subscribeOn和observeOn的很好的例子和解释,我强烈建议检查它。

    Observable<RequestFriendModel> folderAllCall = service.getUserRequestslist(urls.toString());
        folderAllCall.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(result -> result.getRequested())
                .subscribe(this::handleResults, this::handleError);


   private void handleResults(List<Requested> folderList) {
        if (folderList != null && folderList.size() != 0) {

                            usersList.addAll(folderList);

            }
            adapter.notifyDataSetChanged();
        }
    }

    private void handleError(Throwable t) {
        Toast.makeText(getContext(),t.getMessage(),Toast.LENGTH_LONG).show();
    }

在界面中:

    @Headers({ "Content-Type: application/json;charset=UTF-8"})
@GET
Observable<RequestFriendModel> getUserRequestslist(@Url String url);

POJO 模型:

public class RequestFriendModel {

@SerializedName("requested")
@Expose
private List<Requested> requested = null;

public List<Requested> getRequested() {
    return requested;
}

public void setRequested(List<Requested> requested) {
    this.requested = requested;
}
}