RxJava构成了可观察的基础上的条件里面emmited项目

我不知道我是正确的措辞措辞,这是我在做什么:下载图像(如果需要)应用一些效果(模糊),并将其设置为设备壁纸: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()运营商认为,该代码不会提高太多

回答:

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

以上是 RxJava构成了可观察的基础上的条件里面emmited项目 的全部内容, 来源链接: utcz.com/qa/257601.html

回到顶部