2017-04-05 28 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 */);