Diamo un'occhiata alle opzioni:
AsyncTask - Consente di eseguire operazioni in background e pubblicare risultati su un thread dell'interfaccia utente. Progettato per l'utilizzo con qualcosa di breve che deve accadere in background, che una volta completato aggiorna immediatamente l'interfaccia utente.
Loopers - Essenzialmente è un costrutto che ti aiuta a implementare l'elaborazione della coda su un thread. Così, gli altri possono inviare i messaggi di thread che vengono aggiunti a una coda che poi gestisci in modo sequenziale.
Servizi - Essenzialmente un'app che viene eseguita in background e non ha un'interfaccia utente. Una volta avviato, può continuare a funzionare.
Threads - Penso che tu capisca questo. Asyc all'interno della tua app. Muore con la tua app.
Quindi, per rispondere alla tua domanda, una discussione sarà la migliore. Un dispositivo esterno è in esecuzione indipendentemente dal codice dell'applicazione, ma interagisce solo con il telefono mentre l'app è in esecuzione. Quindi, non ha bisogno di essere emulato come servizio (completamente inutile) e non dovrebbe essere fatto come AsyncTask - non stai emulando le interazioni dell'interfaccia utente (presumo). Un Looper può essere utile, ma dipende dall'interazione specifica tra app e dispositivo. La tua descrizione suggerisce che desideri che qualcosa generi in modo indipendente gli eventi gestiti dalla tua applicazione (con traffico potenzialmente bidirezionale tra i due). L'utilizzo di Looper richiede la codifica sia dell'applicazione che del dispositivo esterno come thread separati, quindi utilizzare Loopers su ciascuno per gestire le comunicazioni in coda tra i due.
Quindi, se usi il costrutto del Looper o meno, dovresti comunque emulare il tuo dispositivo esterno in un thread. Inoltre, un Looper introdurrebbe un ulteriore livello di riferimento e astrazione tra la tua app e il dispositivo reale. Sono sicuro che quando lavorerai con il dispositivo attuale, vorresti modificare il codice dell'applicazione il meno possibile. Usando un Looper, avresti bisogno di scrivere un thread che gestisca la comunicazione attraverso il costrutto Looper. Poiché la comunicazione effettiva probabilmente sarà già asincrona o tramite un'altra libreria sincrona (con thread), emulandola come un thread è facile utilizzare la stessa semantica dell'implementazione finale (non sarà necessario aggiungerla a un wrapper Looper o rimuovere quello della tua app e test / debug di un altro livello di interfaccia).