问题标签 [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 投票
2 回答
3059 浏览

android - 为什么要考虑在 RxJava 中使用 AndroidObservables

据我了解AndroidObservable有助于确保:

  1. 订阅者总是在主线程上观察
  2. 当片段/活动被分离/停止时,观察立即停止,并且与框架相关的组件(如 ui textviews 等)不会更新。

但是,为了确保释放上下文(防止泄漏),我看到的大多数示例通常都说您无论如何都必须执行 .unsubscribe onDestroyView/onDestroy,这实际上会停止订阅,并阻止订阅者接收这些更新.

所以我的问题是:

如果我通过 .observeOn(AndroidSchedulers.mainThread() 手动指示订阅应该发生在主线程上,那么使用 AndroidObservables 还有其他好处吗?

以下两种方法有什么区别吗?

0 投票
1 回答
11124 浏览

android - 在 Kotlin for Android 中编程时使用 RxAndroid 或 RxKotlin?

我将开始在我的 Android 项目中使用响应式编程。我使用 Kotlin 作为主要语言,现在我想申请 Rx。我的第一选择是 RxAndroid,但后来我注意到有 RxKotlin。

据我所知,两者都是从 RxJava 派生的,所以 RxAndroid 可能为 android 常见任务提供了一些 API。另一方面,RxKotlin 开箱即用地支持lambas,并允许我避免将 kotlin 与 java 混合。

在这种情况下,哪个是首选库?

0 投票
1 回答
892 浏览

java - 你如何使用 RxJava Observables 进行延续?

所以我有一个A依赖于一秒的异步操作,B. 如何使 B 成为 A 的延续,就像使用then函数 Javascript Promises 或.NET TPL中的ContinueWith一样?

让我们从 Android 中获取一个场景,其中我有两个服务端点:

  • 一种用于获取图像的 URL
  • 一种用于获取图像本身

代码:

希望这两个操作以代码方式嵌套,而是采用一种读起来更像它的行为的格式 - 顺序。

关于 RxJava/RxAndroid 中的 Observables,我一直找不到任何关于延续的信息。有人可以帮忙吗?

0 投票
1 回答
4152 浏览

android - 使用 RxJava 获取对象,转换包含列表,并使用列表

我试图解决的高级问题是使用 RxJava将Foo包含在获取FooContainer(Observable)中的对象列表转换为对象列表。FooBar

我的(困惑的)尝试:

我的困惑(或至少有一点)是将扁平列表移回列表的步骤。

注意:我正在尝试在 Android 应用程序中执行此操作。

0 投票
1 回答
721 浏览

android - 了解数据流和多个订阅者(使用改造)

假设我有 2 个 Observable(A 和 B),它们本质上是网络调用(使用 Retrofit 提供上下文)。

该应用程序的当前流程如下:

  • A & B 大约在同一时间(异步)启动。
  • B 在用户交互时执行 0 次或多次

考虑到这 2 个 observables/api 调用,我有 3 个不同的场景要监听。

  1. 我想立即知道 Observable A 何时完成
  2. 我想立即知道 Observable B 何时完成
  3. 我想知道两者什么时候完成

首先,这是 RxJava 的一个很好的用例吗?

我知道如何单独执行每个场景(zip用于最后一个场景),尽管我不知道如何同时完成所有场景。

如果我订阅 Observable A,A 就开始了。如果我订阅 B,则 B 开始。如果 A & B 在我订阅 zip(a, b) 之前完成,我可能会错过这个活动并且永远不会真正看到这个完成,对吧?

任何一般指导将不胜感激。我的 RxJava 知识很薄:P

0 投票
2 回答
5219 浏览

rx-java - 如何使用带有 flatMap 的 Timer Observable 发出结果

我通过以下方式使用 rxjava 进行维护任务:

在需要定期维护的类中,我使用以下静态订阅,这会导致 Observable 在类加载到内存时首次启动,然后按指定的定期间隔启动。

现在我有一种情况,我想向 UI 报告我的维护结果。

通常,我会使用以下架构

但是这里我们有一个只执行一次的 Observable。

对于定期执行的 Observable,我找不到在 Subscriber 中调用 Action 的方法,因此我可以使用subscriber.onNext() 传递结果。看起来 Observable 没有合适的签名,它可以从 timer() 中花费很长时间,同时允许订阅操作。但是知道 rxjava 我确信有一个技巧 ;-)

我可以使用 zip 压缩 Timer Observable 和一次性 Observable 来完成这项工作(基本上将两个版本压缩在一起),但我宁愿使用第一个结构,因为它的行为略有不同。

--

我尝试通过以下方式将两个版本合并为一个:

我没有创建和发出“null” Observable,而是创建了一个允许我向订阅者发送结果的 Observable。

相当混乱,但这应该工作,对吧?有更简单的解决方案吗?你觉得呢?你有没有什么想法?

0 投票
1 回答
2757 浏览

rx-java - 如何防止 Observable 排队 Timer 迭代

我正在使用以下 Observable 来执行常规任务。Observable 在类首次加载到内存时启动,然后定期执行我的代码。由于它是单个 Observable,因此可以保证 [从我的测试中看到的假设] 代码永远不会再次启动并并行处理,以防它运行的时间长于间隔。

但这也有一个缺点,即 rxjava 会累积延迟的排放,并在延迟迭代完成后快速启动它们。示例:如果定时器被编程为每 1000 毫秒迭代一次,并且迭代 n 需要 5000 毫秒,则迭代 n+1、n+2、n+3 等按顺序启动,但一个接一个,并且不遵守定时器间隔.

没那么糟糕,但真正的问题是当 Android 休眠几个小时时会发生什么。因为一旦设备唤醒,rxjava 会以快速顺序启动所有错过的迭代,这会对性能造成相当大的影响。

我如何告诉 rxjava 忘记错过的迭代?如果迭代需要更长的时间,我希望计时器在迭代完成时启动,或者我想放弃错过的迭代并在到期时开始下一次迭代。我尝试使用 sample() 和其他过滤器,但不知何故并没有给我想要的效果,或者我不知道如何正确应用它们。

请注意,我不想为每次迭代创建一个新的 Observable(我可以为此使用 zip),因为我想确保代码不是从多个线程执行的。

0 投票
1 回答
1716 浏览

java - RxAndroid 在相机更换时去抖动谷歌地图

我有一个使用谷歌地图并监听相机变化的应用程序。我的问题是,在每次更换相机时,我都必须请求我的后端。我想做的只是通过使用 RxAndroid/Java 去抖动来限制请求的数量。

我的代码如下所示:

如您所见,我强制对两者(subscribeOn 和 observeOn)都使用 MainThread,但我仍然收到此错误“不在主线程上”。

这里是堆栈跟踪:

你有什么主意吗 ?

注意:如果我从 Observable.create(...) 中取出 map.setOnCameraChangeListerner(...) 它可以正常工作。

0 投票
1 回答
5400 浏览

android - 如何在 RxJava 中延迟从列表中发出项目?

我正在使用 Retrofit 从 REST API 获取书签:

现在我想从这个列表中延迟发出每个项目。

我在 Java 中做了类似的事情但从onCompleted未被触发。

我做错了什么?

用法:

0 投票
0 回答
135 浏览

android - OnCompleted 调用不整洁

我是 Rx 编程的新手(到目前为止我玩得很开心^^)。我正在尝试将 AsyncTask 调用转换为 Rx 函数。

我的功能:

  • 获取所有已安装的应用
  • 标准化标签
  • 按字母顺序对所有内容进行排序
  • 按字母组排列它们(这是一个 Multimap(letter, list of apps))并将结果传递给适配器以显示所有内容。

以下是我到目前为止对 Rx 所做的事情:

一旦我按字母分组,完成后我订阅:

观察员:

一切正常,除了一个问题:观察者的 onCompleted 调用顺序不正确。所以我得到了我所有的应用程序,按字母排序,但是这些组的显示顺序不正确(首先是 C,然后是 Y,然后是 M 等)。

我想代码中有很多错误,你能帮我解决这个问题,也许能理解这一切是如何工作的吗?

谢谢

更新: 按照评论部分中的建议(感谢人们),这是我在标准化标签后尝试的内容:

但它永远不会进入比较功能。