我试图理解RxJava并遇到以下情况。
请考虑以下方法,该方法返回一个调用NsdManager.registerService
的observable。 registerService方法需要一个在注册成功(或失败)时调用的侦听器。
public Observable<Boolean> registerService() {
return Observable.create(new Observable.OnSubscribe<Boolean>() {
@Override
public void call(Subscriber<? super Boolean> subscriber) {
nsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, registrationListener);
// how to proceed?
}
});
}
只有在调用侦听器之后,观察者才能提供通知,但是异步调用侦听器。
如何使用RxJava执行此操作?
我使用BehaviorSubject想出了以下内容。不知道它是否是最好的解决方案,但它确实有效。
private BehaviorSubject<Boolean> registrationSubject;
public Observable<Boolean> registerService() {
registrationSubject = BehaviorSubject.create();
Observable.create(new Observable.OnSubscribe<Boolean>() {
@Override
public void call(Subscriber<? super Boolean> subscriber) {
NsdServiceInfo serviceInfo = new NsdServiceInfo();
serviceInfo.setServiceName(serviceName);
serviceInfo.setServiceType(NSD_SERVICE_TYPE);
serviceInfo.setPort(serverSocket.getLocalPort());
nsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, registrationListener);
}
}).subscribe(registrationSubject);
return registrationSubject;
}
private NsdManager.RegistrationListener registrationListener = new NsdManager.RegistrationListener() {
@Override
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
registrationSubject.onNext(false);
registrationSubject.onCompleted();
}
@Override
public void onServiceRegistered(NsdServiceInfo serviceInfo) {
registrationSubject.onNext(true);
registrationSubject.onCompleted();
}
@Override
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { }
@Override
public void onServiceUnregistered(NsdServiceInfo serviceInfo) {}
};
答案 0 :(得分:3)
我认为最好尽可能避免使用主题。
在您的解决方案中,您只能使用主题调用onNext
和onCompleted
。但是,在Observable.create()
方法中,您已经可以访问可以调用这些方法的subscriber
。换句话说,您可以在Observable.create()
方法中包装事件处理程序的完整设置。
public Observable<Boolean> registerService() {
return Observable.create(new Observable.OnSubscribe<Boolean>() {
@Override
public void call(final Subscriber<? super Boolean> subscriber) {
NsdServiceInfo serviceInfo = new NsdServiceInfo();
serviceInfo.setServiceName(serviceName);
serviceInfo.setServiceType(NSD_SERVICE_TYPE);
serviceInfo.setPort(serverSocket.getLocalPort());
nsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD,
new NsdManager.RegistrationListener() {
@Override
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(false);
subscriber.onCompleted();
}
}
@Override
public void onServiceRegistered(NsdServiceInfo serviceInfo) {
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(true);
subscriber.onCompleted();
}
}
@Override
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { }
@Override
public void onServiceUnregistered(NsdServiceInfo serviceInfo) {}
}
);
}
});
}
答案 1 :(得分:2)
在侦听器实现中调用:
subscriber.onNext(result)
subscriber.onComplete()
result
是传递给侦听器的boolean
。