2017-05-29 17 views
1

コールバックを持つ別のメソッドを呼び出す方法があります。私はこのメソッドを離れる前にこのコールバックを受け取りたい。私はラッチが使われているいくつかの他のポストを見た。私のコードは次のようになります:メソッドを終了する前にコールバックを待つ方法(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(); 
    } 
} 

これは動作しません。メソッドはawait()関数でスタックされています。何が起こるかは、メソッドがすぐにawait()にジャンプし、再度onRequestSuccess()メソッドまたはonRequestFailure()メソッドに入ることはありません。私はこれがconcurencyの問題だと思う...この問題を解決する方法に関するアイデア?

EDIT:ラッチを作成するコード行を追加しました。

答えて

1

あなたはこの

new RequestListener<Login>

をしているときに、インターフェイスを実装し、あなたの関数にオブジェクトを渡しています。
これらのメソッドが呼び出されない理由は、リクエストの結果(成功または失敗)を取得した場合にのみ呼び出されるメソッドです。
代わりにこれを行うことができます。

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

私が間違っている場合は私を修正しますが、この場合、私の機能はawait()にも拘束されませんか? (カウントダウンの前に呼び出すように) –

関連する問題