onCompleteのような非同期メソッドから取得した値をどのように扱いますか?

bugra.anadol:

罰金を作品私が書いた次のような方法では、私のUtilsのパッケージであり、私は私の活動の一部から、それを呼び出します。

private static Date date = null;

public static Date getCurrentTime(final Context context){

    FirebaseFunctions firebaseFunctions;
    firebaseFunctions = FirebaseFunctions.getInstance();
    firebaseFunctions.getHttpsCallable("currentTime").call()
            .addOnCompleteListener(new OnCompleteListener<HttpsCallableResult>() {
                @Override
                public void onComplete(@NonNull Task<HttpsCallableResult> task) {
                    try{
                        String dateString = task.getResult().getData().toString();
                        System.out.println("555555555555 TIME : " + dateString);
                        date =  new Date(Long.getLong(dateString));
                    }
                    catch(Exception e){
                        convertFirebaseExceptionToAlertDialog(context, "A network error");
                    }
                }
            });
    while (date == null){
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    return date;
}

私はこのようなメソッドから値を返すためにループして値をチェックするよりも良い方法があるかどうかを知りたいです。(値を取得する方法は、onCompleteのような内部メソッドから返される、するonSuccess)

フランクPuffelen:

あなたは、同期、非同期の仕事である何かを作ることができます。あなたのことを意味し、あなたのコードは、のためにgetCurrentTime戻すことはできませんDate呼び出しがあること、コードgetCurrentTime、常にそれが非同期の結果を返す関数を呼び出していることを認識する必要があります。

私は通常、この問題に対処最も単純な方法は、型のカスタムコールバックインタフェースを定義することです。

public interface DateCallback {
  void onCallback(Date value);
}

そして、あなたは、コールバックに渡すことができgetCurrentTime、それはクラウド機能から現在の時間を持ったときに、その実装は、その後呼び出し、。何かのようなもの:

public static Date getCurrentTime(final Context context, DateCallback callback){
    FirebaseFunctions firebaseFunctions;
    firebaseFunctions = FirebaseFunctions.getInstance();
    firebaseFunctions.getHttpsCallable("currentTime").call()
            .addOnCompleteListener(new OnCompleteListener<HttpsCallableResult>() {
                @Override
                public void onComplete(@NonNull Task<HttpsCallableResult> task) {
                    try{
                        String dateString = task.getResult().getData().toString();
                        System.out.println("555555555555 TIME : " + dateString);
                        callback.onCallback(new Date(Long.getLong(dateString)));
                    }
                    catch(Exception e){
                        convertFirebaseExceptionToAlertDialog(context, "A network error");
                    }
                }
            });
}

そして、あなたがそれを呼び出すと思います。

getCurrentTime(this, new DateCallback() {
  public void onCallback(Date value) {
    System.out.println("Current time "+value)
  }
});

参照してください:

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=351937&siteId=1