2017-12-02 150 views
0

我不知道我是正确的措辞措辞,这是我在做什么:下载图像(如果需要)应用一些效果(模糊),并将其设置为设备壁纸:RxJava构成了可观察的基础上的条件里面emmited项目

data class SetWallpaperIntent(val bitmap : Bitmap?, val url : String) 

setWallpaperObservable.switchMap { setWallpaperIntent -> 
    if (setWallpaperIntent.bitmap == null) { 
     downloader.DownloadWallpaper(setWallpaperIntent.url) 
      .flatMap { 
       if (it is Result.Download.Success) { 
        Observable.just(setWallpaperIntent.copy(bitmap = it.bitmap)) 
              .compose(::blurWallpaper) 
              .compose(::setWallpaper) 
              .startWith(Observable.just(it)) 
       } else { 
        //Result.Download.Progress/Result.Download.Error events 
        Observable.just(it) 
       } 
      } 
    } else { 
     Observable.just(it) 
      .compose(::blurWallpaper) 
      .compose(::setWallpaper) 
    } 
} 

此代码按预期工作,但也有几件事情我不会这种方法,如:

  1. 我不停地重复码.compose(::blurWallpaper).compose(::setWallpaper)
  2. 我创造了很多单项观察Observable.just(it)

所以,我的问题是...有没有更好的方法来实现我想要做的事情。或者我的方法是正确的?

顺便说一句,我也使用.publish()运营商认为,该代码不会提高太多

+0

我想在创建一个返回下载图像的'Observable'后,基本上就完成了。我会这样做:'downloadWallpapaer(url).map(img - > blurWallpaper(img))。subscribe(img - > setWallpaper(img))''。 – GVillani82

+0

是的,但有时我已经有位图,再次下载它将浪费资源 – feresr

+0

好吧,然后你添加一个抽象:'getWallpaper(url)'(代替'downloadWallpaper')返回'downloadWallpapaer url)'或'Observable.just(preexistingImage)' – GVillani82

回答

2

您可以定义返回图像的通用方法,无论如果它已经存储在本地,或者如果您需要下载它。这将永远是一个Observable<Image>

Observable<Image> getWallpaper(url) { 
    if(imageExists(url)) { 
     return Observable.just(getAlreadyDownloadImage(url)); 
    } else { 
     return downloadWallpapaer(); 
    } 
} 

downloadWallpapaer有这样的签名:

Observable<Image> downloadWallpapaer(String url); 

也可以定义与这些签名的两种方法:

Image blurWallpaper(Image image); 

void setWallpaper(Image image); 

然后你把所有一起:

getWallpaper(url).map(image -> blurWallpaper(image)) 
        .subscribe(image -> setWallpaper(image)); 

在我看来,将壁纸应用到链条的末端是有意义的,因为你正在消费这些数据,你不只是在变形。这是我把它放在subscribe部分。