0

我想_http._tcp.local.每 5 秒扫描一次 Bonjour 设备(我需要在服务(和后台线程)中执行此操作。

现在我每 5 秒创建一个 JmDNS ( JmDNS.create()) 的新实例,这会泄漏内存;)。我认为必须有更好的方法来做到这一点,但我不知道......谁能帮助我?

 try {
      final JmDNS jm;
      ArrayList<String> foundDevices = new ArrayList<String>();
      jm = JmDNS.create();
      jm.addServiceListener("_http._tcp.local.", listener = new ServiceListener() {
      @Override
      public void serviceAdded(ServiceEvent event) {
            jm.requestServiceInfo(event.getType(), event.getName(), 1);
      }

      @Override
             public void serviceRemoved(ServiceEvent event) {
      }

      @Override
      public void serviceResolved(ServiceEvent event) {
             JSONObject obj = null;
             ServiceInfo info = event.getInfo();
             //Log.e("TCLogging", "RAW: " + info);

             String Name = info.getName();
             foundDevices.add(Name);

             } catch (Exception e) {
                 Log.e("TCLogging", "Error");
             }
         }
      });
      ServiceInfo serviceInfo = ServiceInfo.create("_http._tcp.", "TC_" + android.os.Build.MODEL, 0, "AndroidApp");
      jm.registerService(serviceInfo);


      } catch (Exception e) {
          Log.e("TCLogging", e.toString());
      }
4

2 回答 2

1

您可以每 N 秒调用一次 JmDNS.list(String type),这将返回它找到的服务的 ServiceInfo。第一次调用需要时间(您可以通过列表重载(字符串类型,长超时)来控制它),默认值似乎是 6 秒。

于 2013-12-28T14:09:04.920 回答
0

关于 JmDNS,我不知道的是,当设备在网络中被发现或消失时,您会收到通知。我想每 N 秒扫描一次以查看网络中有哪些设备。但是,等到您收到任何设备更改的通知会更容易(并且资源占用更少)。

接受的答案确实对我每 N 秒进行一次扫描有效,但这不是最理想的方法!

于 2015-03-19T18:36:58.740 回答