2017-05-29 3 views
1

Ich habe eine Methode, in der ich eine andere Methode aufrufen, die einen Rückruf hat. Ich möchte diesen Rückruf erhalten, bevor ich meine Methode verlasse. Ich sah einige andere Beiträge, in denen Latches verwendet werden. Mein Code sieht so aus:So warten auf Callback vor dem Verlassen der Methode (Java)

public void requestSecurityToken(<some params>){ 
    final CountDownLatch latch = new CountDownLatch(1); 
    MyFunction.execute(<someParams>, new RequestListener<Login>() { 
     @Override 
     public void onRequestFailure(SpiceException spiceException) { 
      //TODO 
     } 

     @Override 
     public void onRequestSuccess(Login login) { 
      //handle some other stuff 
      latch.countDown(); 

     } 
    }); 


    try { 
     latch.await(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

Dies funktioniert nicht, die Methode bleibt in der Funktion await() hängen. Was passiert, ist, dass die Methode sofort in die awarn() -Methode springt und nicht erneut in die onRequestSuccess() - oder onRequestFailure() -Methode geht. Ich denke, das ist ein Problem mit der Problematik ... Irgendwelche Ideen, wie man dieses Problem beheben kann?

EDIT: Hinzugefügt die Codezeile, wo ich das Latch erstellen.

Antwort

1

Wenn Sie dies tun

new RequestListener<Login>

Sie ein Objekt auf Ihre Funktion übergeben, die eine Schnittstelle implementiert.
Deshalb werden diese Methoden nicht aufgerufen, diese Methoden werden nur aufgerufen, wenn Sie das Anforderungsergebnis erhalten (Erfolg oder Fehler).
Sie können dies stattdessen tun.

MyFunction.execute(<someParams>, new RequestListener<Login>() { 
    @Override 
    public void onRequestFailure(SpiceException spiceException) { 
     someFunction(); 
    } 

    @Override 
    public void onRequestSuccess(Login login) { 
     //handle some other stuff 
     someFunction(); 
     latch.countDown(); 

    } 
}); 





public void someFunction()[ 
    try { 
    latch.await(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
    } 
+0

Korrigieren Sie mich, wenn ich falsch liege, aber wird in diesem Fall meine Funktion nicht in der await() hängen bleiben? (wie wir es vor dem Countdown nennen) –

Verwandte Themen