如何处理从异步方法(如onComplete)获取的值?



我写的以下方法工作正常,在我的 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)返回)

你不能让异步的东西同步工作。对于您的代码,这意味着您的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)
}
});

另请参阅:

  • getContactsFromFirebase() 方法返回一个空列表

相关内容

  • 没有找到相关文章

最新更新