- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将 Retrofit 与 RxJAva 一起用于获取 Rss 提要的应用程序,但 rss 不包含所有信息,因此我使用 jsoup 来解析每个项目链接,以检索图像和文章的描述。现在我这样使用它:
public Observable<Rss> getDumpData() {
return newsAppService.getDumpData()
.flatMap(rss -> Observable.from(rss.channel.items)
.observeOn(Schedulers.io())
.flatMap(Checked.f1(item -> Observable.just(Jsoup.connect(item.link).get())
.observeOn(Schedulers.io())
.map(document -> document.select("div[itemprop=image] > img").first())
.doOnNext(element -> item.image = element.attr("src"))
)))
.defaultIfEmpty(rss)
.ignoreElements()
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread());
}
我在这一行收到一个错误:defaultIfEmpty(rss)
它不识别平面图的 rss。当我将 defaultIfEmpty(rss)
移动到平面图括号中时,出现另一个错误,指出必须将返回类型更改为 Element。他们有什么解决办法吗?
最佳答案
首先你需要摆脱所有与 observeOn 的并发并使用 subscribeOn。
.observeOn(Schedulers.io())
如果想将另一个线程的数据同步回事件循环,请考虑将 observeOn 与 AndroidScheduler 一起使用。通常,您会在订阅可观察对象之前使用 observeOn,以便同步回 ui-loop 并更改 ui-information。
.observeOn(AndroidSchedulers.mainThread())
其次,不建议改变管道中的对象。您应该及时返回一个新对象。
.doOnNext(element -> item.image = element.attr("src"))
考虑到前两点,我尝试重构您的解决方案。我正在使用 RxJava2-RC5
flatMap 运算符有很多重载。其中之一提供了将传入值和创建值压缩在一起的功能。
Observable<Rss> rssItemObservable = newsService.getDumpData()
.flatMap(rss -> getRssItemInformation(rss).subscribeOn(Schedulers.io()),
(r, rItemList) -> {
Rss rInterim = new Rss();
rInterim.items = rItemList;
return rInterim;
});
用于检索 Rss 中每个项目信息的帮助方法。请考虑使用 maxConcurrency 的重载,因为默认情况下它会立即订阅每个流。因此 flatMap 会创建许多 http 请求。
private Observable<List<RssItem>> getRssItemInformation(Rss rss) {
return Observable.fromIterable(rss.items)
.flatMap(rssItem -> getImageUrl(rssItem).subscribeOn(Schedulers.io()), (rItem, img) -> {
RssItem item = new RssItem();
printCurrentThread("merge1");
item.image = img;
item.link = rItem.link;
return item;
}).toList().toObservable();
}
检索图像 url 的帮助方法。返回 observable 与并发无关。如果发生错误,将返回一个空字符串作为默认值。
private Observable<String> getImageUrl(String link) {
return Observable.fromCallable(() -> Jsoup.connect(link).get())
.map(document -> document.select("div[itemprop=image] > img").first())
.map(element -> element.attr("src"))
.onErrorResumeNext(throwable -> {
return Observable.just("");
});
}
您可以在 github.gist 查看完整示例:https://gist.github.com/anonymous/a8e36205fc2430517c66c802f6eef38e
关于android - RxJava 平面图链接请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40132703/
我是一个对 Haskell 感兴趣的初学者,我一直在尝试自己实现 flatmap (>>=) 以更好地理解它。目前我有 flatmap :: (t -> a) -> [t] -> [a] flatm
我正在尝试创建一个 searchBar,它通过带有请求的 MKLocalSearch 搜索地址并使用 RXSwift 并绑定(bind)到 RXCocoa 到目前为止,我已经完成了以下工作1.过滤和去
我正在使用 javascript/jquery(基于 DOM,而非 Canvas )构建某种拖放应用程序。 想法是能够在 3D 场景上拖动 div(在 3D 中旋转的 div)。 它在 2D 平面上工
我有这样的情况 class A { private B b; public B getB() { return b; } } 还有另一个B类 class B {
在链 obs1.flatmap(x -> obs2()).subscribe(sub) 如果 obs2 产生错误,它会立即调用 onError 在 sub 上。这是记录在案的: Note that i
在这篇文章中,平面图或平面图是指可以在平面(或等价物)中绘制的抽象图在球体上),以及根据特定此类绘图在每个顶点处的边的圆形顺序。这个额外的信息决定了球体上的嵌入(直到移动顶点和边,使得它们永远不会与任
我有一个 Flux 字符串。对于每个字符串,我必须进行远程调用。但问题是,进行远程调用的方法实际上返回的是 Mono 响应(显然,因为对应于单个请求,所以将有单个响应)。 处理此类情况的正确模式应该是
我对 MapPartition 没有搞清楚。请有人解释一下 Mappartition 的一些用例以及它与 FlatMap 有何不同? 最佳答案 区别在于方法的接口(interface)以及它们的调用方
我有这个问题,我有一个 RDD[(String,String, List[String]),我想“平面化”它以获得一个 RDD[(String ,字符串, 字符串)]: 例如: val x :RDD[
所以这将是我第一次无法通过搜索找到问题的答案.. 我对 D3 和 Javascript 总体来说还很陌生,我想要实现的是在浏览器中从 CAD 工具 (Autodesk Revit) 导出的一些曲线的可
我需要替换多年前构建的 Flash 查看器,以显示来自 AutoCAD 的交互式2D 平面图。 目前,AutoCAD 文件被读取并转换为 XML 文件,其中包含表示平面图对象的多边形的 X 和 Y 坐
我有 2 个 retrofit 电话需要进行 A 和 B: (A):返回一个ArrayList (B):获取 (A) 的结果,它是一个 ArrayList。 (B) 遍历 ArrayList 并使用每
我是一名优秀的程序员,十分优秀!