2017-04-18 39 views
0

我試圖加載縮小的預覽圖像,然後是僱用圖像。我想確保如果有任何機會,僱用圖像首先加載,預覽圖像被丟棄。用ReactiveX逐行圖像加載

考慮以下示例,其中:

  • 序列1是預覽圖像請求
  • 序列2是員工圖像請求
  • 序列3是組合的序列
  • 序列4是所得圖像渲染序列

Example 1: 

1 ------P------- 
2 ---------H---- 

3 ------P--H---- 

4 ------*--*---- 


Example 2: 

1 ----H--------- 
2 --------P----- 

3 ----H|-------- 

4 ----*|-------- 

唯一的解決辦法,我拿出這麼遠的保存狀態變量,它表示是否聘用已被使用takeWhile加載,但是這需要一些非典雅操作,也涉及副作用。

我正在尋找正確的RX方式來做到這一點。

回答

4

你能做到不保存狀態,並使用變量:

Observable<Bitmap> hiresObservable = getHiresObservable() 
     .share() 
Observable<Bitmap> previewObservable = getPreviewObservable() 
     .takeUntil(hiresObservable); 


Observable.merge(previewObservable, hiresObservable) 
     .subscribe(bitmap -> { 
      //do something with the bitmap 
     }); 

這是非常相似,這answer

+0

完美地工作。爲什麼需要'share()'? – Shahar

+0

因爲否則你會訂閱兩次你不想要的hiresObservable,共享'多播'你的Observable,所以多個訂閱會看到相同的值,實際上你可能需要更加小心,並使用其他'多播'操作符來防止種族(例如,如果你僱用有緩存),你可以在這裏閱讀我的解釋:http://stackoverflow.com/a/42826568/3903847 – yosriz