Повторный поиск устройства JmDNS

Я хочу сканировать устройства Bonjour (_http._tcp.local.) каждые 5 секунд и получать массив с найденными устройствами (имена, поэтому строки). Мне нужно сделать это в сервисе (и в фоновом потоке).

Теперь я каждые 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());
      }

person matthijs2704    schedule 28.12.2013    source источник
comment
Вам действительно нужно сканировать каждые 5 минут? Почему бы просто не настроить JmDNS и позволить ему уведомлять вас, когда в сети обнаруживаются новые службы. Для этого есть слушатели. Вам нужен только один JmDNS.create(). После настройки JmDNS вы будете получать информацию о каждом новом сервисе. Вам не нужно активно сканировать их.   -  person RaphMclee    schedule 29.12.2013


Ответы (2)


Вы можете просто вызвать JmDNS.list(String type) каждые N секунд, что будет возвращать ServiceInfo для найденных служб. Этот первый вызов займет некоторое время (вы можете контролировать это с помощью перегрузка списка (строковый тип, длительное время ожидания)), по умолчанию, кажется, 6 секунд.

person radical    schedule 28.12.2013
comment
Спасибо! Мне очень помогло :D - person matthijs2704; 28.12.2013

Чего я не знал о JmDNS, так это того, что вы получаете уведомление, когда устройство обнаруживается или исчезает в сети. Я хотел сканировать каждые N секунд, чтобы увидеть, какие устройства есть в сети. Но гораздо проще (и менее ресурсоемко) просто подождать, пока вы не получите уведомление о каких-либо изменениях устройства.

Принятый ответ помог мне выполнить сканирование каждые N секунд, но это не самый идеальный способ сделать это!

person matthijs2704    schedule 19.03.2015