【问题标题】:How to deal with the values taken from asynchronous methods like onComplete?如何处理从 onComplete 等异步方法中获取的值?
【发布时间】:2020-03-22 22:29:32
【问题描述】:

我编写的以下方法运行良好,在我的 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等内部方法返回)

【问题讨论】:

    标签: java android firebase asynchronous google-cloud-functions


    【解决方案1】:

    你不能让异步的东西同步工作。对于您的代码,这意味着您的getCurrentTime 不能返回Date。调用getCurrentTime 的代码总是需要知道它调用的是一个返回异步结果的函数。

    我通常处理这个最简单的方法是为该类型定义一个自定义回调接口:

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

    然后您可以将回调传递给getCurrentTime,然后它的实现会在从 Cloud Functions 获取当前时间时调用该回调。比如:

    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)
      }
    });
    

    另见:

    【讨论】:

      猜你喜欢
      • 2021-04-18
      • 2020-09-13
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      相关资源
      最近更新 更多