如何在 Observer.onNext 中运行 IO 操作,该操作在 mainThread 中调用



我有一个产品列表,其中有一个图像作为uri(字段),我需要将其保存在内部存储中。问题是我没有找到如何使用当前代码:

  1. 我从使用改造的WS获得数据RestClient.getClient().getProducts()

  2. 当我从WS得到数据时,我需要将它们保存到Realm DB

  3. 在Realm DB上保存图像后,我尝试在内部存储上保存图像,但我不能,因为onNextmainThread内被调用。

    public void getProductsHandler(final Context context) {
    MyApplication application = MyApplication.get(context);
    rx.Observable<ProductResponse> faq = RestClient.getClient()
        .getProducts()
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(application.defaultSubscribeScheduler());
    faq.subscribe(new Observer<ProductResponse>() {
      @Override public void onCompleted() {
      }
      @Override public void onError(Throwable e) {
      }
      @Override public void onNext(ProductResponse response) {
        RealmService realmService = new RealmService(realm);
        realmService.setProducts(response.getResults());
        ((MainActivity) context).saveBannersIntoInternal(response.getResults());
      }
    });
    }
    

有好的解决方案吗?

使用flatMap将web服务调用和保存到DB两个操作链接在一起。

RestClient.getClient().getProducts()
    .flatMap(response -> saveToDB())
    .subscribeOn(Schedulers.io());

最后一个subscribeOn(Schedulers.io())调用将允许Retrofit调用和flatMap在IO Scheduler上运行。

相关内容

  • 没有找到相关文章

最新更新