2016-07-11 15 views
1

Ich bin gerade dabei, das Android-Billing-Beispiel für eine App zu bearbeiten. Die Beispielanwendung verweist auf eine asynchrone Methode. Ich habe mich im Internet umgesehen und finde keine gute Definition, bitte kann jemand mit einem Beispiel helfen. Probe wie folgt:Was bedeutet eine "asynchrone Methode" in Java?

// Start setup. This is asynchronous and the specified listener 
// will be called once setup completes. 

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
    public void onIabSetupFinished(IabResult result) { 

Ist es eine Methode, die nicht sofort ein Ergebnis zurück?

+0

Es bedeutet im Grunde, dass die Methode in einem separaten Thread ausgeführt wird und den Thread nicht blockiert, der startSetup aufgerufen hat. Es ist asynchron, da weder eine Abhängigkeit noch die Möglichkeit besteht, genau zu steuern, wann es ausgeführt wird. – nasukkin

Antwort

0

Ja. In diesem Kontext bedeutet "asynchron", dass die Methode sofort zurückkehrt und die Ausführung mit der Anweisung nach dem Methodenaufruf fortgesetzt wird. Einige Zeit später wird die onIabSetupFinished(...) Methode beim Listener aufgerufen. Dies wird als Rückruf bezeichnet. Eine wichtige Überlegung bei asynchronen Callbacks ist der Thread, in dem sie aufgerufen werden. Sie müssen dazu in der Dokumentation für diese API nachlesen.

0

Eine asynchrone Methode ist keine typische Anfrage/Antwort Sie können sich das wie ein Versprechen vorstellen oder etwas, das ohne Pooling antwortet. In Ihrem Fall, dass Sie einen anonymen Zuhörer erstellen, die das Versprechen

public void onIabSetupFinished(IabResult result){ 
//you will eventually get the response here 
} 
0

hier lösen wird, wenn ich nicht irre, sind Sie startSetup auf dieses Verfahren Bezug genommen, die eine final OnIabSetupFinishedListener akzeptiert und angeblich die Abrechnung einrichtet.

Was Sie scheinen verwirrt zu sein, ist diese eher syntaktisch obskure Eigenschaft von Java genannt anonyme innere Klasse.

Lassen Sie mich versuchen, Ihre Frage zu beantworten, um es einfacher zu machen:

Ist es eine Methode, die nicht sofort ein Ergebnis zurück?

Ja, irgendwie (es gibt natürlich nichts zurück, denn es ist eine void Methode). Es einfach gesagt, ist eine Methode, die in der Javadoc eine Instanz der Schnittstelle OnIabSetupFinishedListener und macht einen Teil seiner Arbeit asynchron wie angegeben akzeptiert und gibt nichts zurück:

Dies wird asynchron den Setup-Prozess starten.

Somit ist dieses Verfahren ähnlich dem, was andere void Java-Methode aussieht. Die einzige zusätzliche Implementierungsinformation ist, dass eine Art von Kommunikation zwischen dem listener, den Sie an diese Methode übergeben, und einigen anderen Objekten eingerichtet wird.

aber, dass die Kommunikation zu einem späteren Zeitpunkt, nichtzum Zeitpunkt dieser Methode können Sie rufen, startSetup passieren wird. Also, was wichtig ist, ist die Call-Site, also wie Sie zu Anruf diese Methode in Ihrer eigenen App gehen. Dies geschieht, hoffentlich, zum Zeitpunkt der Einrichtung Ihrer App und Sie müssen es schnell laufen lassen und daher bietet diese Methode einen Callback Mechanismus und kehrt so schnell wie möglich in einer synchronen Art und Weise ohne unnötige Verzögerung zurück.Dies bedeutet, dass Ihr aufrufender Thread Fortschritte machen kann und der Listener, den Sie an diese Methode übergeben haben, später in einem anderen Thread verwendet werden kann, wenn ein entsprechendes Ereignis eintritt.

Die Verwirrung kommt auch teilweise aufgrund der Art, wie anonyme innere Klassen typischerweise codiert werden. So Ihre Aufrufort aussehen wie die following:

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
    public void onIabSetupFinished(IabResult result) { 
     if (!result.isSuccess()) { 
     // Oh noes, there was a problem. 
     Log.d(TAG, "Problem setting up In-app Billing: " + result); 
     } 
     // Hooray, IAB is fully set up! 
    } 
}); 

Hier bieten Sie eine anonyme Implementierung der Schnittstelle OnIabSetupFinishedListener direkt an der Aufrufstelle (ohne tatsächlich eine eigene Klasse zu schaffen, dass die Schnittstelle implementiert, mit dem konstruieren wie class MyListener implements OnIabSetupFinishedListener).