2013-05-20 10 views
6

Ho un'applicazione Android che interfaccia l'hardware di terze parti tramite una libreria fornita dal fornitore. Quando i dati dall'hardware sono pronti per essere elaborati, la libreria richiama la mia applicazione.Creazione di un gestore di callback per gestire più callback in Android

La libreria di terze parti, a causa della sua progettazione, effettua solo una richiamata all'applicazione. Tuttavia, la mia app ha alcune attività asincrone diverse che vorrebbe fare quando viene richiamata la chiamata (ad esempio, registrare, aggiornare la visualizzazione dell'interfaccia utente, chiamare programmi esterni). Cercando di ventilare l'evento, in un certo senso, con metodi diversi. Così, sto pensando di fare questo nella mia classe di applicazione:

interface MyCallback { 
    public void doSomething(ArrayList<DataClass>); 
} 

public class MyApp extends Application { 
... 
private MyCallback cb; 
public void registerCallback (MyCallback callback) { 
    cb = callback; 
} 

public methodCalledBy3rdPartyAPIOnData (ArrayList<DataClass> data){ 
    cb.doSomething(ArrayList<DataClass> data); 
} 

che avrebbe funzionato per un unico metodo da chiamare, ma sto avendo un problema su come fare questo per una serie di callback .. .e assicurandoci che vengano chiamati in modo asincrono. Esistono esempi o best practice per fare questo genere di cose in un'applicazione Android o in Java in generale?

risposta

8

userei leggermente atta Observer Pattern (l'adattamento sta notificando ogni osservatore in un nuovo thread):

vostro gestore di callback è il soggetto (cioè, essendo osservata):

public class Subject { 
    private List<Observer> observers = new ArrayList<>(); 

    public void registerObserver(Observer observer) { 
     observers.add(observer); 
    } 

    public void notifyObservers(Object data) { 
     for (final Observer observer : observers) { 
      new Thread(new Runnable() { 
       @override 
       public void run() { 
        observer.notify(data); 
       } 
      }).start(); 
     } 
    } 

    public methodCalledBy3rdPartyAPIOnData (ArrayList<DataClass> data){ 
     notifyObservers((Object)data); 
    } 
} 

E ogni dei veri gestori deve applicare la seguente interfaccia

public interface Observer { 
    public void notify(Object data); 
} 

E registrarsi chiamando subject.registerObserver(this).

+0

L'osservatore è buono, ma ti manca un osservatore di annullamento della registrazione. Ciò potrebbe essere auspicabile se la classe di notifica dell'OP "rimane intorno" (ad esempio, è un singleton) e gli osservatori multipli potrebbero essere membri non statici di istanze di Attività, ad esempio. Per evitare perdite, come mantenere l'intero stack di visualizzazione in un singleton che supera la durata dell'attività, l'attività vorrebbe annullare la registrazione dell'ascolto su Post o simile. – Tom

+0

@ Tom Hai ragione, ma volevo mostrare il minimo indispensabile. Avrei dovuto dirlo, però. –

+0

Penso che questa sia l'opzione giusta, mente. – Tom