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

Popular posts from this blog

javascript - Google App Script ContentService downloadAsFile not working -

javascript - Function overwritting -

php - Find a regex to take part of Email -