我将Rxjava与Retrofit结合使用。我想在android数据库中更新该图像的状态。所以真正的问题是,如果第一张图片是先上传的,那么首先上传的是什么?当队列中的图像被执行或图像以异步方式上载时,onNext()被顺序调用。我想知道这种方法所需的解决方案。到目前为止我的代码如下。
tisImageEntities = SelectQuery.getImageByStatus(mContext);
tisImageCount = 0;
Observable.fromIterable(tisImageEntities)
.map(tisImageEntity -> new TisImageUploadEntity(tisImageEntity.projectId,
tisImageEntity.imagePath.substring(tisImageEntity.imagePath.lastIndexOf("/") + 1), "fit.jpg",
tisImageEntity.detail, tisImageEntity.imageType,
getBase64EncodedString(tisImageEntity.imagePath)))
.filter(tisImageUploadEntity -> null!=tisImageUploadEntity.Content)
.flatMap(tisImageUploadEntity -> hitachiRetrofitApi.uploadTisImages(tisImageUploadEntity))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<ResponseBody>() {
@Override
public void onNext(ResponseBody responseBody) {
try {
String response = responseBody.string().toString();
UpdateQuery.updateTisImageStatus(mContext,tisImageEntities.get(tisImageCount).projectId); // here is image staatus updated correctly??
tisImageCount++;
Log.d(TAG, "on next for update entity" + response);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
cancleProgressDialog();
}
@Override
public void onComplete() {
Log.d(TAG, "on complete for update entity");
cancleProgressDialog();
}
});
那么在onNext()中更新查询对吗?它是否按顺序更新状态?如果没有,那么请纠正我
答案 0 :(得分:1)
flatMap()
不会保留订单,因此您将执行多个请求
结果不会按顺序发出,而是按结果到达顺序发出。
顺便说一下,您应该将io调度程序应用于flatMap()
(hitachiRetrofitApi.uploadTisImages(tisImageUploadEntity)
)返回的Observable以获得并行性。
保留订单,您可以使用concatMapEager()
运算符,这将获得并行性,但会保留源项的顺序。
此外,只是一个建议,你有不同的选择,因为你想要到达的是收集请求结果和匹配的请求图像实体,你可以使用flatMap()
重载与{{1}使用这种方式,您可以使用匹配的图像实体向下发送一对结果,使用resultSelector
更新数据库,并为订阅者仅映射结果doOnNext()
以处理它
ResponseBody