问题标签 [rx-android]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
698 浏览

android - 如果视图从不可见,我应该在视图生命周期的什么时候取消订阅?

我有一个使用 API 将一些文本转换为该文本的本地化版本的视图。如果视图在布局中可见,则此方法有效,因为一旦视图被破坏onDetachedFromWindow(),就会被调用。但是,如果 View 是不可见的并且永远不会附加到 WindowonDetachedFromWindow()永远不会被调用。

我尝试在其中执行本地化,onAttachedToWindow()但这最终导致文本无法显示/切断。

在视图从不可见/放到窗口上的情况下,这会导致内存泄漏。

所以我想知道处理可能永远不会附加到窗口的视图订阅的最佳方法是什么?

0 投票
1 回答
2631 浏览

android - RxAndroid ViewObservable NetworkOnMainThreadException

我有一个Button从中创建一个Observable<OnClickEvent>.

单击该按钮时,我希望从网络中获取文件,但我遇到了有关网络和线程的问题。

这个例子抛出android.os.NetworkOnMainThreadException

所以我尝试从另一个线程。

以下抛出rx.exceptions.OnErrorNotImplementedException: Observers must subscribe from the main UI thread, but was Thread[RxNewThreadScheduler-1,5,main]

好的..现在我在开始时尝试 a .debounce()

这成功了。

显然我不喜欢在我的代码中添加延迟,所以我试图弄清楚发生了什么,线程方面的。为什么第一个示例不在.map()后台线程中执行代码?

或者我在这里错过了什么?

- - 更新

我将我的 TestAPI 更改为返回一个 Observable,并将对 networkButtonObservable 的第一次调用更改为.flatMap(). 这也可以正常工作。但我仍然不知道为什么原来的使用方式.map()会失败。

0 投票
1 回答
850 浏览

android - MVP 架构与 Android 中的 Rx Observables 混合?

MVP/MVVM 模式中的 Observable 会去哪里?

在我假设的模型中?

我有一个接受传入数据的后台服务。

0 投票
2 回答
4705 浏览

java - 如何从 BehaviorSubject 获取最新值?

如何从RxAndroidBehaviorSubject上检索最新值?

一些背景信息:我正在使用 RxJava 来实现 MVVM 模式。我的 ViewModel 封装了 s 的“可绑定属性” BehaviorSubject。我将它们作为可观察对象绑定到 UI 元素,确保界面不断更新(并且由于 using BehaviorSubject,即使在设置值之后进行订阅,它也会发生)。

对于业务逻辑,我仍然希望能够访问属性的最新(实际)“原始”值。

我怎么做?

肯定BehaviorSubject会以某种方式缓存它,因为它会为订阅它的人重新发布最新值。

然而BehaviorSubject.last()只返回一个Observable<T>,而且它似乎没有公开任何T返回类型的方法。

我知道我可以自己缓存它,但感觉是多余的。

我想我也可以在我的 getter 中创建一个一次性订阅,只是为了获取它的最新值,然后将其返回给调用代码,但这似乎很笨拙。

手头有更整洁的东西吗?

0 投票
1 回答
1007 浏览

android - SwipeRefreshLayout & RxAndroid subscribeOn(AndroidSchedulers.mainThread()) 不工作

我使用SwipeRefreshLayout来处理拉刷新并使用Retrofit返回Observable来获取我的数据,但是Observable.subscribeOn(AndroidSchedulers.mainThread()) 不起作用

日志:假

我的代码错了吗?

0 投票
1 回答
259 浏览

rx-java - 在 RxAndroid 的流中创建条件对象

我还是 RxAndroid 的新手,我想在流中加载单个对象。这个对象可以作为 Observable 从两个不同的类中加载。在我的场景中,首先从 加载对象provider1,如果null提供了,则从 加载对象provider2

我的问题是

  • 我不知道如何优雅地检查null
  • 我不知道如何处理两者,Observable<MyObj>并且MyObj以相同的方法

目前我的代码看起来像这样

这看起来不太好,是否有我缺少的操作员?或者至少有一种方法可以展平单个 Observable,以便我可以执行以下操作:

还是我只是以完全错误的方式做事?任何帮助表示赞赏。

0 投票
2 回答
1087 浏览

android - Retrofit + RxAndroid:慢请求阻塞其他请求

我面临一个问题,这是由于我的后端有时回复缓慢。事实上,我正在使用 Retrofit + RxAndroid 与我的服务器通信,当我执行多个请求时,似乎一次只执行一个请求。有没有办法增加这个限制以避免阻塞等待请求?

谢谢你。

编辑:

想象一下,我正在对长后台进程执行一个请求。

同时,我正在向可以立即响应的服务发出另一个请求。

在我的情况下,第一个请求阻止了第二个请求的执行。这是我的问题。你知道为什么和我能做些什么来同时执行这两个请求吗?

谢谢。

0 投票
2 回答
1878 浏览

android - 从 Observable 中获取元素的索引

我开始学习 RxJava。我有一组视图,我想OnClickListener使用ViewObservable.clicks(). 的实现OnClickListener将只调用一个方法,该方法取决于视图在数组中的位置(例如:)populate(viewPositionInTheArray)

一个必要的解决方案将是这个:

为了使用 RxJava 做到这一点,我想我需要做一些流链接。但是,我不知道必须以优雅的 FRP 方式使用哪些功能。有什么建议么?

谢谢

0 投票
1 回答
2088 浏览

retrofit - 基于逻辑的 RxJava 重试

在这种情况下,我有一个使用 Retrofit 的 API 调用,可能由于网络错误而失败。如果失败,我们将显示带有重试按钮的错误消息。当用户按下重试按钮时,我们需要再次重试最新的 Observable。

可能的解决方案:

  1. 重试:在订阅 observable 之前应该使用重试,如果发生错误并且这是我不想要的,它会立即重新订阅,只有当用户按下重试按钮时我才需要重新订阅。

  2. RetryWhen:它会在您发出项目时继续尝试,直到您发出 Observable 错误,然后它将停止。同样的问题,除非用户决定,否则我不需要开始重试过程。

  3. 重新订阅同一个 Observable:这个解决方案将开始发送 Observable 项目,问题是我们使用了缓存操作符,所以如果一个 Observable 失败,我们会缓存失败的项目,当我们再次订阅时,我们会得到再次出现同样的错误。

还有其他解决方案吗?

0 投票
0 回答
157 浏览

android - 缓冲事件,在上一个组的最后一个事件后 1 秒开始新组

我在 Android 上,我创建了一个Observable触地得分。只要新事件在一秒钟内到来,我就想缓冲它们。从最后一次着陆发射经过一秒钟后,我想创建一个所有收集到的事件的列表并发出它,然后开始一个新的收集。

我有 2 个可以工作的代码片段,但它们要么看起来不太被动(#1),要么看起来不太复杂(#2)。他们来了:

  1. 我使用buffer(Func0<? extends Observable<? extends TClosing>> bufferClosingSelector)重载 - 当返回的选择器发出一个项目时,这意味着从最后一个源发射经过一秒钟,可以发射缓冲区。
  2. 选择器Obserbable函数返回的是一个PublishSubject,以便我可以决定何时将排放推送到它。
  3. 有一项Runnable任务将新的排放量推向结束主题。此任务被安排(通过 Android 处理程序)在当前处理的源着陆发射发生后一秒钟运行。当随后在一秒钟内发生新着陆的新源发射时,该任务被取消,并在一秒钟后再次安排新的发射。

这是相关的Android代码:

我不喜欢Handler在这个解决方案中使用和所有这些,所以我进一步研究了。

第二个片段(touchPublishSubject 和 touch listener 完全相同):

  1. 我重用着touchPublishSubject陆生成作为窗口关闭可观察到,首先用 1 秒超时对其进行去抖动
  2. 显然,随着去抖动发生在 上Scheduler.computation(),它移动观察到同一个调度程序,我需要使用observeOn(AndroidSchedulers.mainThread())- 我觉得有点奇怪的是嵌套Observable的调度程序,它只关闭缓冲区窗口,促进整个链在它的调度程序中发生以及

编码:

这段代码有效,我比第一个更喜欢它,感觉更像是应该用 Rx 来完成。但它很复杂,因为Observable要获得它需要嵌套和大脑体操。我是否buffer缺少自动执行相同操作的重载(即在最后一次发射时间为 1 秒后关闭其窗口)?

编辑:其中一条评论让我意识到 Ben Christensen 的演讲,然后我发现了这个:https ://blog.kaush.co/2015/01/05/debouncedbuffer-with-rxjava/ ,它链接到一些问题的实施。似乎是一个非常普遍的要求,如果有一个内置的运算符来做这个会很好。无论如何,我会考虑这些其他来源中提出的解决方案,这里是此类问题的规范。