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