使用retrofit和rxjava更新数据库中的图像上载完成状态

时间:2017-06-07 05:39:28

标签: android rest rx-java retrofit2 rx-android

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

1 个答案:

答案 0 :(得分:1)

flatMap()不会保留订单,因此您将执行多个请求  结果不会按顺序发出,而是按结果到达顺序发出。

顺便说一下,您应该将io调度程序应用于flatMap()hitachiRetrofitApi.uploadTisImages(tisImageUploadEntity))返回的Observable以获得并行性。

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

此外,只是一个建议,你有不同的选择,因为你想要到达的是收集请求结果和匹配的请求图像实体,你可以使用flatMap()重载与{{1}使用这种方式,您可以使用匹配的图像实体向下发送一对结果,使用resultSelector更新数据库,并为订阅者仅映射结果doOnNext()以处理它

ResponseBody