I used jmDNS to find some services on wifi network. The problem is that sometimes after service is resolved, and I remove this listener, it triggers again with serviceResolved() method. jmDNS 3.4.1
private static JmDNS jmDNS;
private static ServiceType currentType;
private static ServiceListener currentListener;
public static Observable<String> getXXXIp(final ServiceType type,
final WifiManager wifiManager) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override public void call(final Subscriber<? super String> subscriber) {
InetAddress inetAddress = WifiUtils.getDeviceIpAddress(wifiManager.getConnectionInfo());
try {
jmDNS = JmDNS.create(inetAddress);
currentType = type;
currentListener = new ServiceListener() {
@Override public void serviceAdded(ServiceEvent event) { ... }
@Override public void serviceRemoved(ServiceEvent event) { }
@Override public void serviceResolved(ServiceEvent event) { ... }
};
jmDNS.addServiceListener(type.getCode(), currentListener);
} catch (IOException e) {
LOGGER.error("Exception occurred while searching " + type.getCode(), e);
subscriber.onError(e);
}
}
}).doOnNext(new Action1<String>() {
@Override public void call(String s) {
finish();
}
}).doOnError(new Action1<Throwable>() {
@Override public void call(Throwable throwable) {
finish();
}
});
}
private static void finish() {
if (jmDNS != null) {
LOGGER.info("jmDNS -> close");
try {
jmDNS.removeServiceListener(currentType.getCode(), currentListener);
jmDNS.close();
} catch (IOException e) {
LOGGER.error("Cannot close jmDNS ", e);
}
jmDNS = null;
currentListener = null;
}
}
It is a little complicated logic of service check, so I cut it off, but the main thing that's matter is in one moment onNext() is called once so method finish() is called. And I checked hashcode for listener which I've nullified in finish() and when after this listener onServiceResolved() is called I check it hashcode and it is the same. What is going on? Any ideas?