在 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,我认为最好只是从您的方法返回链,如下所示:

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

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

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

这样,您可以按如下方式编写视图模型代码

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 请求,将在 mainThread 上返回结果,这可能是您想要的。 :)

这篇文章有一些很好的示例和解释订阅和观察,我强烈建议你检查一下。

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;
}
}

相关内容

  • 没有找到相关文章

最新更新