2017-04-05 25 views
0

我想使用RxJava 2从数据库执行一组项目的后台任务。项目列表可能为空,这意味着我无法使用flatMapIterable,因为它会在空的时候抛出异常清单:FlatMapIterable和空列表

Observable 
      .fromCallable(() -> SQLite 
         .select() 
         .from(VideoUpload.class) 
         .where(VideoUpload_Table.status.eq(VIDEO_UPLOAD_IN_PROGRESS)) 
         .queryList()) 
      .flatMapIterable(videoUploads -> videoUploads) 
      .map(videoUpload -> { 
       videoUpload.setStatus(VIDEO_UPLOAD_NOT_STARTED); 
       return videoUpload; 
      }) 
      .firstElement() 
      .subscribeOn(Schedulers.io()) 
      .subscribe(/* TODO */); 

我可以移动到一切可调用,执行滤波那里等,但我想有可能是基于上面的代码更优雅的解决方案。

+1

如果我正确理解你的问题,你唯一的担心是,源observable可能是空的,你不想在流上执行'filter'。在这种情况下,不会['flatMapMaybe()'](http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html#flatMapMaybe(io.reactivex.functions.Function))方便吗? – azizbekian

+0

是的,我正在考虑使用一个也许,但我不知道如何,你有什么建议吗?关注点不仅是过滤器,而且也是flatMapIterable,因为如果传入迭代器为空,它将引发异常。 – Francesc

回答

0

原来flatMapIterable没有在RxJava-2上抛出异常,我记得它在RxJava-1上抛出异常。无论如何,这样做的方式如下

Observable 
      .fromCallable(() -> { 
       List<VideoUpload> videos = SQLite 
         .select() 
         .from(VideoUpload.class) 
         .where(VideoUpload_Table.status.in(VIDEO_UPLOAD_IN_PROGRESS, VIDEO_UPLOAD_QUEUED)) 
         .queryList(); 
       return videos; 
      }) 
      .flatMapIterable(videoUploads -> videoUploads) 
      .map(videoUpload -> { 
       videoUpload.setStatus(VIDEO_UPLOAD_NOT_STARTED); 
       return videoUpload; 
      }) 
      .firstElement() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(/* TODO */);