android - serviceRemoved is not called while discovering the devices -
i working on project needs discover devices in same wi-fi network. implementing have used jmdns library.
it giving me list of devices registered current network, when device gets unregistered should call serviceremoved method of servicelistener. however, not calling serviceremoved when device unregistered.
here code.:
public class lanservice { private static lanservice instance = new lanservice(); private final string type = "_sample._tcp.local."; private jmdns jmdns = null; private serviceinfo serviceinfo; private wifimanager.multicastlock lock; private servicelistener listener; public static lanservice getinstance() { return instance; } public void startdiscovery() { wifimanager wifi = (wifimanager) appbase.getappcontext().getsystemservice(context.wifi_service); if (wifi.iswifienabled()) { new handler().postdelayed(new runnable() { @override public void run() { thread startdiscoverythread = new thread(new runnable() { @override public void run() { if (serviceinfo != null) { stopscan(); } setup(); } }); startdiscoverythread.start(); } }, 2000); } } @override public void stopdiscovery() { thread stopdiscoverythread = new thread(new runnable() { @override public void run() { stopscan(); } }); stopdiscoverythread.start(); } private void setup() { try { wifimanager wifi = (wifimanager) appbase.getappcontext().getsystemservice(context.wifi_service); if (!wifi.iswifienabled()) { wifi.setwifienabled(true); } // device ip address final inetaddress deviceipaddress = getlocalipaddress(); if (deviceipaddress != null) { lock = wifi.createmulticastlock(getclass().getname()); lock.setreferencecounted(true); lock.acquire(); jmdns = jmdns.create(deviceipaddress); serviceinfo = serviceinfo.create(type, build.model, 3129, "plain test service android"); jmdns.registerservice(serviceinfo); jmdns.addservicelistener(type, listener = new servicelistener() { @override public void serviceresolved(serviceevent ev) { log.d(tag, "service resolved : " + ev.getinfo().getqualifiedname() + " ipaddr : " + ev.getinfo().getinetaddresses()[0]); } @override public void serviceremoved(serviceevent ev) { log.d(tag, "service removed : " + ev.getinfo().getqualifiedname() + " ipaddr : " + ev.getinfo().getinetaddresses()[0]); } @override public void serviceadded(serviceevent ev) { try { // required force serviceresolved called again (after first search) log.d(tag, "service added : " + ev.getinfo().getqualifiedname()); jmdns.requestserviceinfo(ev.gettype(), ev.getname(), 1000); } catch (exception e) { e.printstacktrace(); } } }); } } catch (ioexception ex) { ex.printstacktrace(); log.e(tag, ex.getmessage(), ex); } log.i(tag, "started zeroconf probe...."); } private void stopscan() { try { if (jmdns != null) { log.i(tag, "stopping zeroconf probe...."); jmdns.removeservicelistener(type, listener); jmdns.unregisterservice(serviceinfo); jmdns.unregisterallservices(); jmdns.close(); jmdns = null; } if (lock != null) { log.i(tag, "releasing mutlicast lock..."); if (lock.isheld()) lock.release(); lock = null; } } catch (exception ex) { log.e(tag, ex.getmessage(), ex); } } } why serviceremoved not getting invoked when device unregistered network? suggestions appreciated .
why open thread inside runnable of handler? handler runs runnable on separate thread. is:
-the handler runs runnable on thread , open thread , stuff. maybe problem.
instead of this:
new handler().postdelayed(new runnable() { @override public void run() { thread startdiscoverythread = new thread(new runnable() { @override public void run() { if (serviceinfo != null) { stopscan(); } setup(); } }); startdiscoverythread.start(); } }, 2000); try this:
new handler().postdelayed(new runnable() { @override public void run() { if (serviceinfo != null) { stopscan(); } setup(); } }, 2000);
Comments
Post a Comment