2012-03-14 3 views
0

Я пытаюсь автоматически обновлять службы JmDNS в фоновом режиме. Ничего не происходит, когда я пытаюсь:Автоматическое обновление служб JmDNS в действии

@Override 
public void onDestroy() { 
    try { 
     hiNeighborService.unregisterListener(this); 
     this.unbindService(this.serviceConnection); 

    } catch (Exception ex) { 
     Log.e(LOG_TAG, "Exception occur during destroying the app."); 
    } 

    super.onDestroy(); 
} 

@Override 
public void onStart() { 
    /*new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       refreshServices(); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    }).start();*/ 

    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 

    // This schedule a runnable task every 2 minutes 
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
     public void run() { 
     rebindService(); 
     refreshServices(); 
     } 
    }, 0, 1, TimeUnit.SECONDS); 


    super.onStart(); 
} 

@Override 
public void onRestart() { 
    /*new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       refreshServices(); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    }).start();*/ 
    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 

    // This schedule a runnable task every 2 minutes 
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
     public void run() { 
     rebindService(); 
     refreshServices(); 
     } 
    }, 0, 1, TimeUnit.SECONDS); 

    super.onRestart(); 
} 

@Override 
public void onResume() { 
    /*new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       refreshServices(); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    }).start();*/ 

    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 

    // This schedule a runnable task every 2 minutes 
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
     public void run() { 
     rebindService(); 
     refreshServices(); 
     } 
    }, 0, 1, TimeUnit.SECONDS); 

    super.onResume(); 
} 

Это мой resfreshServices метода():

private void refreshServices() { 
    Log.i(LOG_TAG, "Refresh available neighbors..."); 
    final List<Neighbor> activeNeighbors = this.hiNeighborService 
      .getActiveNeighbors(); 
    Log.d(LOG_TAG, activeNeighbors.size() + " active neighbors are found!"); 

    new Thread(new Runnable() { 
     public void run() { 
      Log.i(LOG_TAG, "refresh UI..."); 
      try { 

       synchronized (activeNeighborsViewModel) { 
        activeNeighborsViewModel.clear(); 
        for (Neighbor neighbor : activeNeighbors) { 
         NeighborViewModel vm = new NeighborViewModel(
           neighbor); 
         vm.setNeighborUnreadCount(ConnectActivity.this 
           .getUnreadMessageCount(neighbor)); 
         if (activeNeighborsViewModel.contains(vm)) { 
          activeNeighborsViewModel.remove(vm); 
         } 

         activeNeighborsViewModel.add(vm); 
        } 
       } 
       notifyServiceListChanged(); 

       Log.i(LOG_TAG, "refresh completed!"); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
       Log.e(LOG_TAG, ex.toString()); 
      } 
     } 
    }).start(); 
} 

Обычно, который получает вызываемый при нажатии кнопки, однако я хотел бы, чтобы это было автоматически. Этот код ничего не делает, если я не нажал кнопку Resfresh, которая вызывает resfreshServices(). Я попытался попробовать его потоками, но активность закрывается, и приложение тоже. Есть идеи?

ответ

0

Сначала немного прокомментируйте свой код. Почему вы реализуете один и тот же код три раза тремя разными способами. Я предполагаю, что вы программируете андроид (loking при именах методов). Метод onresume выполняется каждый раз, когда действие запускается или возобновляется. См. this link для получения дополнительной информации по этой теме.

Хорошо, тогда ... Вы уже проверили документы для получения дополнительной информации о ScheduledExecutorService?

Теперь для проблемы jmdns. Библиотека jmDns имеет встроенную функциональность для обновления служб. вы можете слушать новые службы и принимать соответствующие меры, когда доступны новые сервисы. Я не думаю, что повторный опрос служб - это правильный подход.

Посмотрите here на небольшое руководство по использованию jmdns в android.

Смежные вопросы