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)
}
}
此代码按预期工作,但也有几件事情我不会这种方法,如:
- 我不停地重复码
.compose(::blurWallpaper).compose(::setWallpaper)
- 我创造了很多单项观察
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