- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
RxJava 的新手,我对接口(interface)回调(通过接口(interface)变量从代码的内层/模块调用)与 RxJava 有疑问。为了更清楚,快速示例:
标准回调接口(interface)实现,接口(interface),类A和B
interface CustomCallback {
void onCallbackCalled(String str);
}
class ClassA {
private ClassB classB;
public ClassA() {
classB = new ClassB(new CustomCallback() {
@Override
public void onCallbackCalled(String str) {
System.out.println("Callback called " + str);
}
});
}
}
class ClassB {
private CustomCallback customCallback;
public ClassB(CustomCallback callback) {
customCallback = callback;
}
private void somethingHappened() {
customCallback.onCallbackCalled("method somethingHappened");
}
}
当调用 classB 方法“somethingHappened”时,结果是:“回调调用方法 somethingHappened”。接口(interface)的方法 onCallbackCalled(String str) 可以从类 B 任意多次调用。
A 级 ↓ ...............................................通过构造函数注入(inject)接口(interface)
CLASS B................↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ onCallbackCalled(...) 0...n 号
现在是 RxJava。我发现的 99% 的案例。
class ClassA {
private ClassB classB;
public ClassA() {
classB = new ClassB();
}
public void rxJavaMethod() {
DisposableObserver<String> observer = classB.getObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<String>() {
@Override
public void onNext(String s) {}
@Override
public void onError(Throwable e) {}
@Override
public void onComplete() {}
});
}
}
class ClassB {
private Observable<String> getObservable() {
return Observable.just(can be different from "just", for sake of example);
}
}
方案是:
CLASS A ↓...................... 一次获取 Observable 资源的调用
CLASS B................↑ EDIT 返回发出 0...n 个值的 observable
所以基本上你从顶层调用(在这个例子中),你从内层得到关于状态的响应。
问题:
1) 如果你有一个动态变化的模型(内层)(但不是任何类型的 AsyncTask 等),并且你想通知顶层(例如 UI)状态已经改变(很好例如:游戏)。
2) RxJava 库中是否有任何类型的“桥梁”类(我认为它是“订阅它,然后你可以根据需要多次向它传递参数,并且信息/可观察值将被发送给订阅者).
3) 尝试这样做而不是标准接口(interface)回调是否有任何意义和优势(在上述情况下,不是“单击按钮,获得一次响应”)
更新,基于上述示例的答案
正如 Bob Dalgleish 提到的,建立这种桥梁的方法是使用扩展 Subject
class ClassA {
private ClassB classB;
public ClassA() {
classB = new ClassB();
}
public void rxJavaMethod() {
DisposableObserver<String> observer = classB.getCallbackSubjectRx()
.subscribeWith(new DisposableObserver<String>() {
@Override
public void onNext(String s) {}
@Override
public void onError(Throwable e) {}
@Override
public void onComplete() {}
});
}
}
class ClassB {
private BehaviorSubject<String> mCallbackRx;
public ClassB() {
mCallbackRx = BehaviorSubject.create();
}
// method somethingHappened can be invoked whenever whe want and
// it will send given parameter to all subscribers
private void somethingHappened() {
mCallbackRx.onNext("method somethingHappened");
}
// multiple subscribers allowed
public BehaviorSubject<String> getCallbackSubjectRx() {
return mCallbackRx;
}
}
缺点可能是,如果我们想使用一个“桥”来处理多种回调类型(接口(interface)有方法,我们只使用一种方法:“onNext()”),我们可能需要创建带有回调参数的包装类.在我看来这不是什么大问题。
另一方面,我们可以访问所有 RxJava 运算符。 http://reactivex.io/documentation/operators.html
(上面的示例是针对 RxJava2 的,其中 Disposable 基本上是来自 RxJava1 的订阅)。
最佳答案
首先要注意的是
CLASS B................↑ returns 0...n observables to observer
不是真的。 B 类返回一个 observable,偶尔会发出 0..n 值。
(问题不清楚)。无论出于何种原因,来自 B 类的内部可观察对象正在改变状态。最常见的原因是另一个进程/任务/线程正在为其提供数据,而您想在 UI 中显示结果状态。
我一直使用的一种简单类型的“桥接”类 Subject<>
类。您可以使用 .onNext()
向它们发出新值订阅者将获得这些值。
如果回调接口(interface)都是标准化的,那么它们会有一些优势,但它们在各地都各不相同。您必须记住,对于您正在查看的这个东西,您需要一些特定的界面,而对于另一个东西,则需要一个不同的界面。虽然如今 UI 事件趋于统一,但尝试混合 UI 事件、网络事件和数据库事件仍然会让您感到不知所措。具有更小的接口(interface)类,主要封装在 rxJava 泛型类中,使得组合功能更容易。
编辑:改进示例代码。
Yammer Engineering有一篇好文章关于使用 Observable.create()
(以前是Observable.fromEmitter()
,以前是Observable.fromAsync()
。他提出的重点是
使用 Observable.create()
通过向底层接口(interface)注册监听器来为您处理订阅步骤。更重要的是,它安排在 unsubscribe()
时注销监听器。发生。
开箱即用,此代码处理多个订阅者,每个订阅者接收其自己的可观察数据流。
正如我上面提到的,监听器协议(protocol)特定于您注册的对象。如果那个东西只支持一个监听器,那么你可能想要引入一个 Subject
。订阅被观察的事物,你的所有其他观察者也订阅这个主题。
编辑结束。
我最喜欢的解决方案组合示例是 distinctUntilChanged()
运算符(operator)。因为它是一个适用于通用可观察对象的运算符,所以它封装了保存连续值以进行比较并仅发出不同值的状态属性。我经常用它来记录状态变化。要使用标准回调接口(interface)达到相同的目的,需要添加一个不同的接口(interface)来将先前的值保存到每个现有接口(interface)。
所以,是的,大多数时候使用 rxJava observables 方法是值得的,只是为了不必记住许多回调协议(protocol)中的哪一个可能适用于当前情况。
关于android - RxJava 代替接口(interface)回调 (Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43820141/
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!