在 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;
}
}
有些情况下我需要链接 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;
}
}