2016-04-23 4 views
0

Beispiel konvertieren:Wie man async Methodenaufruf (Callback) an einen sync Methodenaufruf in Android

Sync vesrion:

int Wetter = GetWeather();

Async Version:

GetWeather (Callback) an die andere Klasse, und wenn andere Klasse bereit, es Rückruf verwenden, um Rückgabewert. callback.receiveWetter (Temperatur); und Callback-Objekt hat eine überschriebene receiveWeather (int) -Methode.

Frage:

jetzt wie tun i async Methode zu synchronisieren Anruf in Android konvertieren. Kannst du mir ein Beispiel geben? Ich weiß, es hat etwas zu tun Thread, warten() etc .. aber nicht wissen, um es zu implementieren.

+0

Beachten Sie, dass Sie eine solche Methode im UI-Thread im Allgemeinen nicht aufrufen sollten (und oft können Sie kein Ergebnis erhalten). –

+0

@ChrisStratton Ich denke, diese Frage hat einen Wert, weil eine solche Umwandlung nützlich sein kann, wenn Sie bereits in einer 'AsyncTask' sind und versuchen, eine lange Kette von asynchronen Anrufen zu vermeiden, indem Sie eine Zeile Code pro Aufruf schreiben. – kftse

Antwort

-1

In der aufgerufenen Methode, anstatt die Callback-Methode aufrufen und das Ergebnis übergeben, nur das Ergebnis zurückgeben. So die Methode ändern Signatur aus dieser:

public void getWeather(WhateverCallback<Type> callback) 

Um dies:

public Type getWeather() 
+0

Warum die down vote? – nasch

0

Der folgende Code tut, was Sie wollen, aber es ist viel besser, nur eine Sperr Getter zu erstellen und wickeln Sie es mit AsyncTask falls async routine auch benötigt wird.

Wenn diese verschachtelt ist, sicher sein, nicht zu

  • wait() der Haupt-Thread
  • laufen beide Segmente im selben Thread

Gerade bei nicht gut, wenn Sie einige Async nur API wickeln dokumentierter Threading-Mechanismus, kann dies dazu führen, dass beide Methoden auf demselben Thread ausgeführt werden.

public class AsyncToSync{ 

    private Object lock= new Object(); 
    private boolean ready = false; 

    public syncCallToAsyncMethod(){ 

     new AsyncMethodProvider().doAsync(new CompletionListener(){ 

      public void onComplete(){ 
       // TODO: Do some post-processing here 

       synchronized(lock){ 
        ready = true; 
        lock.notifyAll(); 
       } 
      } 

     }) 

     synchronized (lock) { 
      while (!ready) { 
       try { 
        lock.wait(); 
       } catch (InterruptedException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     } 

    } 
} 

Siehe Guarded Blocks.

Verwandte Themen