gpt4 book ai didi

java - 如何处理从 onComplete 等异步方法获取的值?

转载 作者:行者123 更新时间:2023-12-01 19:28:06 34 4
gpt4 key购买 nike

我编写的以下方法运行良好,位于我的 Utils 包中,我从我的一些 Activity 中调用它。

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等内部方法返回)

最佳答案

你不能让异步的东西同步工作。对于您的代码,这意味着您的 getCurrentTime 无法返回 Date。调用 getCurrentTime 的代码始终需要知道它正在调用返回异步结果的函数。

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

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

另请参阅:

关于java - 如何处理从 onComplete 等异步方法获取的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60805694/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com