Android 如何在Observer.onNext中运行IO操作';它被称为内主线程

Android 如何在Observer.onNext中运行IO操作';它被称为内主线程,android,multithreading,rx-java,Android,Multithreading,Rx Java,我有一个产品列表,其中有一个图像作为uri(字段),我需要保存在内部存储器上。我没有找到如何使用当前代码执行此操作的问题: 我使用改装从WS获得数据 RestClient.getClient().getProducts() 当我从WS获得数据时,我需要将它们保存到领域数据库中 在域数据库上保存图像后,我尝试将图像保存在内部存储器上,但我无法保存,因为onNext是在main线程内调用的 public void getProductsHandler(final Context context) {

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

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

  • 当我从WS获得数据时,我需要将它们保存到领域数据库中

  • 在域数据库上保存图像后,我尝试将图像保存在内部存储器上,但我无法保存,因为
    onNext
    是在
    main线程内调用的

    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());
    
      }
    });
    }
    
    public void getProductsHandler(最终上下文){
    MyApplication=MyApplication.get(上下文);
    rx.Observable faq=RestClient.getClient()
    .getProducts()
    .observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(application.defaultSubscribeScheduler());
    常见问题解答。订阅(新观察者(){
    @覆盖已完成的公共void(){
    }
    @覆盖公共无效onError(可丢弃的e){
    }
    @覆盖公共void onNext(ProductResponse响应){
    RealmService RealmService=新的RealmService(领域);
    setProducts(response.getResults());
    ((MainActivity)context.saveBannersIntoInternal(response.getResults());
    }
    });
    }
    

  • 有好的解决方案吗?

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

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

    最后一个
    订阅(Schedulers.io())
    call将使改装调用和
    flatMap
    都可以在IO调度程序上运行。

    如果我可以问一下,创建
    线程并启动它们是否发生了什么事情?@Super-califorgilistic我想到了相同的解决方案,但想知道是否可能使其更好您应该使用rx操作符进行操作链接,在您的情况下,
    flatMap