Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RX Java 2,可观察,接受添加的新值_Java_Android_Performance_Rx Java_Rx Java2 - Fatal编程技术网

RX Java 2,可观察,接受添加的新值

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

我希望创建一个LocationHandler类,它返回一个
可观察的
,我可以发送一个新位置,订阅者可以得到最后添加的位置和任何后续值

我已经编写了这个类,它可以工作,但我不知道它是否是正确的方法,因为我添加了一个回调,我感觉很糟糕

谢谢你的帮助

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获得的流。行为需要一个我在创建时无法提供的确定值。是的,我知道问题所在。你的解决方案看起来是合法的。
行为主题
有一个静态方法
创建
,可以创建