Pregunta

Estoy tratando de actualizar automáticamente los servicios de JMDNS en el fondo.Nada está sucediendo cuando lo intento:

@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();
}

Este es mi método de 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();
}

Normalmente, se llama cuando se hace clic en un botón, sin embargo, me gustaría que sea automático.Este código no hace nada a menos que llegue al botón Resfresh que llame a ResfreshServices ().Intenté intentarlo con hilos, pero la actividad se cierra y también lo hace la aplicación.¿Alguna idea?

¿Fue útil?

Solución

Primero un pequeño comentario en su código. ¿Por qué está implementando el mismo código tres veces en tres métodos diferentes? Supongo que usted está programando Android (loking en los nombres de sus métodos). El método ONSUME se ejecuta cada vez que se inicia o se reanuda la actividad. Consulte este enlace Para obtener más información sobre este tema.

OK, entonces ... ¿Ya revisó los documentos para obtener más información sobre el programadoExecutorService ?

ahora para el problema de JMDNS. La biblioteca JMDNS tiene una construcción en funcionalidad para actualizar los servicios. Puede escuchar nuevos servicios y tomar las medidas adecuadas cuando hay nuevos servicios disponibles. No creo que el votación repetido de los servicios es el enfoque correcto.

look aquí para un pequeño tutorial sobre el uso de JMDNS en Android.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top