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

时间:2016-08-17 00:17:14

标签: android multithreading rx-java

我有一个产品列表,其中包含我需要保存在内部存储上的图像uri(字段)。我没有找到如何使用当前代码执行此操作的问题:

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

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

  3. 在Realm DB上保存图像后,我尝试将图像保存在内部存储上,但我无法在onNext内调用mainThread

    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());
    
      }
    });
    }
    
  4. 有什么好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

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

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

最后一次subscribeOn(Schedulers.io())调用将允许Retrofit调用和flatMap在IO调度程序上运行。