使用改造和 rxjava 更新数据库中的图像上传完成状态

Updating Image upload complete status in database using retrofit and rxjava

我将 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() 中更新查询对吗?它是否按顺序更新状态?如果不是那么请纠正我

flatMap()不保留顺序,所以如果你会执行多个请求 结果不会按顺序发出,而是按结果到达顺序发出。

顺便说一句,您应该在 flatMap() (hitachiRetrofitApi.uploadTisImages(tisImageUploadEntity)) 处将 io scheduler 应用于返回的 Observable 以获得并行性。

为了保留顺序,您可以使用 concatMapEager() 运算符,这将获得并行性,但会保留源项目的顺序。

此外,只是一个建议,你有不同的选择,因为你在这里试图得到的是收集请求结果以及匹配的请求图像实体,你可以使用 flatMap() 重载 resultSelector 参数,通过这种方式,您可以向流发送一对匹配图像实体的结果,使用 doOnNext() 更新数据库,并将订阅者的结果 ResponseBody 映射到处理一下。

 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()),
                    (tisImageUploadEntity, responseBody) -> Pair::new
            )
            .doOnNext(pair -> UpdateQuery.updateTisImageStatus(mContext, pair.first.projectId))
            .map(pair -> pair.second)
            .subscribeOn(Schedulers.io());