2016-08-17 44 views
2

我有一个产品的列表,其中有一个图像作为uri(字段),我需要保存在内部存储上。我怎么没发现与当前的代码做的问题:如何在内部调用的Observer.onNext中运行IO操作mainThread

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

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

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

    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()); 
    
        } 
    }); 
    } 
    

什么好的解决办法?

+0

如果我可能会问,创建'Thread's并启动它们会发生什么? – Elltz

+1

@超级califragilistic我认为在相同的解决方案,但想知道如果可能,使其更好 – Abdellah

+0

你应该使用rx操作符进行操作链接,在你的情况下'flatmap' – zella

回答

0

使用flatMap一起链接两个操作,Web服务调用和保存到数据库。

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

最后subscribeOn(Schedulers.io())电话将让双方通话改造和flatMap对IO调度运行。

相关问题