RX Java 2,可观察,接受添加的新值
我希望创建一个LocationHandler类,它返回一个RX Java 2,可观察,接受添加的新值,java,android,performance,rx-java,rx-java2,Java,Android,Performance,Rx Java,Rx Java2,我希望创建一个LocationHandler类,它返回一个可观察的,我可以发送一个新位置,订阅者可以得到最后添加的位置和任何后续值 我已经编写了这个类,它可以工作,但我不知道它是否是正确的方法,因为我添加了一个回调,我感觉很糟糕 谢谢你的帮助 public class LocationHandler { private MessageHandler<Location> onNewItem; private Observable<Location> loca
可观察的
,我可以发送一个新位置,订阅者可以得到最后添加的位置和任何后续值
我已经编写了这个类,它可以工作,但我不知道它是否是正确的方法,因为我添加了一个回调,我感觉很糟糕
谢谢你的帮助
public class LocationHandler {
private MessageHandler<Location> onNewItem;
private Observable<Location> locationObservable;
public LocationHandler(LocationInitializationBuilder locationInitBuilder) {
locationObservable = getHookedObservable()
.mergeWith(locationInitBuilder.build())
.replay(1).autoConnect();
}
private Observable<Location> getHookedObservable() {
return Observable.create(new ObservableOnSubscribe<Location>() {
@Override
public void subscribe(ObservableEmitter<Location> e) throws Exception {
onNewItem = location -> e.onNext(location);
}
});
}
public Observable<Location> getLocation(){
return locationObservable;
}
public void setLocation(Location address){ // <---------- add new values
if (onNewItem != null){
onNewItem.handleMessage(address);
} else {
throw new IllegalStateException("Cannot add an item to a never subscribed stream");
}
}
}
公共类LocationHandler{
私有消息处理器;
私人可观测位置可观测;
公共LocationHandler(LocationInitializationBuilder locationInitBuilder){
locationObservable=GetHookedObjectable()
.mergeWith(locationInitBuilder.build())
.replay(1).自动连接();
}
私有可观察getHookedObservable(){
返回Observable.create(newobservableOnSubscribe(){
@凌驾
public void subscribe(observeiemitter e)引发异常{
onNewItem=位置->e.onNext(位置);
}
});
}
公共可观测getLocation(){
返回位置可观测;
}
公共无效设置位置(位置地址){/您可以使用一个而不是MessageHandler
。Subject可以同时充当可观察对象和订阅者。您可以在LocationHandler
中有一个方法,返回您将订阅的Subject#asObservable
。在内部,当setLocation
时,您必须调用Subject#onNext
提供位置。有不同类型的主题可供选择。请参考文档以选择更适合您需要的主题。例如:
public class LocationHandler {
BehaviorSubject<GeevLocation> mLocationSubject = BehaviorSubject.create();
public Observable<GeevLocation> getLocation() {
return mLocationSubject.asObservable();
}
public void setLocation(GeevLocation address){
mLocationSubject.onNext(address);
}
}
公共类LocationHandler{
BehaviorSubject mLocationSubject=BehaviorSubject.create();
公共可观测getLocation(){
返回mLocationSubject.asObservable();
}
公共无效设置位置(地理位置地址){
mLocationSubject.onNext(地址);
}
}
从外部调用getLocation
并订阅返回的Observable
。调用setLocation
时,您将获得对象onNext
您可以使用一个而不是MessageHandler
。主题可以同时充当Observable和subscriber。您可以在LocationHandler
返回您将订阅的Subject#asobbservable
。在内部,当setLocation
时,您必须调用Subject#onNext
提供位置。有不同类型的主题可用。请参阅文档以选择更适合您需要的主题s、 例如
public class LocationHandler {
BehaviorSubject<GeevLocation> mLocationSubject = BehaviorSubject.create();
public Observable<GeevLocation> getLocation() {
return mLocationSubject.asObservable();
}
public void setLocation(GeevLocation address){
mLocationSubject.onNext(address);
}
}
公共类LocationHandler{
BehaviorSubject mLocationSubject=BehaviorSubject.create();
公共可观测getLocation(){
返回mLocationSubject.asObservable();
}
公共无效设置位置(地理位置地址){
mLocationSubject.onNext(地址);
}
}
从外部调用getLocation
并订阅返回的Observable
。当调用setLocation
时,您将获得对象onNext
,正如Blackbelt已经告诉您的,您将使用主题。特别是我将使用行为主题。主题默认情况下是热的,但它们可以重播ev订阅的ents。如果您订阅,BehaviorSubject将为您提供最后发出的值或初始值。每个订阅方都将在收到时获得这些值。流永远不会结束,因为它是热的。请记住处理错误,因为第二个onError将被吞没
示例代码
class Location {
}
class LocationInitializationBuilder {
static Location build() {
return new Location();
}
}
class LocationHandler {
private Subject<Location> locationObservable;
public LocationHandler(LocationInitializationBuilder locationInitBuilder) {
Location initialValue = LocationInitializationBuilder.build();
locationObservable = BehaviorSubject.<Location>createDefault(initialValue).toSerialized();
}
public Observable<Location> getLocation() {
return locationObservable.hide();
}
public void setLocation(Location address) { // <---------- add new values
locationObservable.onNext(address);
}
}
public class LocationTest {
@Test
public void name() throws Exception {
LocationHandler locationHandler = new LocationHandler(new LocationInitializationBuilder());
TestObserver<Location> test = locationHandler.getLocation().test();
locationHandler.setLocation(new Location());
test.assertValueCount(2);
}
}
类位置{
}
类位置初始化生成器{
静态位置生成(){
返回新位置();
}
}
类LocationHandler{
私人主体位置可观察;
公共LocationHandler(LocationInitializationBuilder locationInitBuilder){
Location InitializationValue=LocationInitializationBuilder.build();
locationObservable=BehaviorSubject.createDefault(initialValue).toSerialized();
}
公共可观测getLocation(){
返回位置Observable.hide();
}
公共无效设置位置(位置地址){/正如Blackbelt已经告诉您的,您将使用Subject。特别是我将使用BehaviorSubject。默认情况下,Subject是热门的,但它们可以通过订阅重播事件。如果您订阅,BehaviorSubject将为您提供最后发出的值或init值。每个订阅方都将在传入时获得这些值。流将永远不会返回因为天气很热,所以不要忘记处理错误,因为第二个错误会被吞掉
示例代码
class Location {
}
class LocationInitializationBuilder {
static Location build() {
return new Location();
}
}
class LocationHandler {
private Subject<Location> locationObservable;
public LocationHandler(LocationInitializationBuilder locationInitBuilder) {
Location initialValue = LocationInitializationBuilder.build();
locationObservable = BehaviorSubject.<Location>createDefault(initialValue).toSerialized();
}
public Observable<Location> getLocation() {
return locationObservable.hide();
}
public void setLocation(Location address) { // <---------- add new values
locationObservable.onNext(address);
}
}
public class LocationTest {
@Test
public void name() throws Exception {
LocationHandler locationHandler = new LocationHandler(new LocationInitializationBuilder());
TestObserver<Location> test = locationHandler.getLocation().test();
locationHandler.setLocation(new Location());
test.assertValueCount(2);
}
}
类位置{
}
类位置初始化生成器{
静态位置生成(){
返回新位置();
}
}
类LocationHandler{
私人主体位置可观察;
公共LocationHandler(LocationInitializationBuilder locationInitBuilder){
Location InitializationValue=LocationInitializationBuilder.build();
locationObservable=BehaviorSubject.createDefault(initialValue).toSerialized();
}
公共可观测getLocation(){
返回位置Observable.hide();
}
公共无效设置位置(位置地址){//实际上我不能使用行为,因为它是我通过LocationInitializationBuilder.build获得的流。行为需要一个我在创建时无法提供的确定值。是的,我知道问题所在。您的解决方案看起来是合法的。行为主题
有一个静态方法创建
,该方法创建一个空的行为主题代码>实际上我不能使用行为,因为它是我通过LocationInitializationBuilder.build获得的流。行为需要一个我在创建时无法提供的确定值。是的,我知道问题所在。你的解决方案看起来是合法的。行为主题
有一个静态方法创建
,可以创建