2011-07-21 15 views
5

Próbuję zrozumieć mechanizm obsługi wywołania zwrotnego. W jaki sposób wywoływana jest metoda handle()? Czy ktokolwiek może podać przykład użycia niestandardowego programu obsługi wywołania zwrotnego (innego niż używany w modułach logowania JASSa) w aplikacji non-Swing?Niestandardowy operator oddzwaniania

Odpowiedz

9

Należy zdefiniować interfejs do obsługi wywołania zwrotnego.

public interface ServiceListener<T> { 
    void callback(T result); 
} 

Należy zdefiniować metodę, która pobiera parametr ServiceListener jako parametr i zwraca nieważne.

Public void runInBackground(ServiceListener listener) { 
    ...code that runs in the background... 
    listener.callback(...data to return to caller...); 
} 

i obecnie można to zrobić z głównego kodu:

runInBackground(new ServiceListener() { 


     @Override 
     public void callback(..returned data...) { 
      ...Do stuff with returned data... 
     } 
}); 
+0

Potrzebuję jednego lub dwóch konkretnych przykładów. Czy możesz trochę rozwinąć? – Partha

+0

Mogę podać przykład z Androidem, jeśli byłoby to pomocne? – slott

+0

@slott: Tak, proszę! – Zolomon

3

Jest to podstawowy przykład wnioskowania o dane z serwera sieciowego przy użyciu AsyncTask z aplikacji Android.

Najpierw zdefiniuj klasę asynchroniczną. Zwróć uwagę, że konstruktor pobiera detektor, którego używamy do opublikowania wyniku, gdy jest gotowy.

public class Webservice extends AsyncTask<String, Void, String> { 
    private DialogListener dialogListener; 

    public Webservice(final DialogListener dialogListener) { 
     this.dialogListener = dialogListener; 
    } 

    @Override 
    protected String doInBackground(final String... strings) { 
     // We cant trigger onComplete here as we are not on the GUI thread! 
     return ""; 
    } 

    protected void onPostExecute(final String result) { 
     dialogListener.onComplete(result); 
    } 
} 

Podstawowe klasy serwer do obsługi różnych komunikacji sieciowej:

public class Server { 
    public void queryServer(final String url, final DialogListener service) { 
     // Simulate slow network... 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     new Webservice(service).execute(url); 
    } 
} 

Możemy teraz użyć tego kodu wewnątrz naszej działalności, nie martwiąc się, jak długo połączenie trwa, ponieważ nie zamierza powstrzymać GUI ponieważ jest wykonywany asynchronicznie.

Server s = new Server(); 

     // Async server call. 
     s.queryServer("http://onto.dk/actions/searchEvents.jsp?minLatE6=55640596&minLngE6=12078516&maxLatE6=55642654&maxLngE6=12081948", new DialogListener() { 
     @Override 
     public void onComplete(final String result) { 
      toast("complete"); 
     } 

     @Override 
     public void onError() { 
      toast("error"); 
     } 
    }); 
Powiązane problemy