Вы не можете заставить что-то асинхронное работать синхронно. Для вашего кода это означает, что ваш 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)
}
});
Также смотрите: