¿Cómo lidiar con los valores tomados de métodos asincrónicos como onComplete?

bugra.anadol:

El siguiente método que escribí, que funciona bien, está en mi paquete de Utilidades y me llaman de algunas de mis actividades.

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

Quiero saber si hay mejores maneras de comprobar el valor por un bucle para devolver un valor de métodos como éste. (Métodos que obtener el valor será devuelto a partir de métodos interiores como onComplete, onSuccess)

Frank Puffelen:

Usted puede hacer algo que es un trabajo asíncrono de forma sincrónica. Para su código que significa que su getCurrentTimelata no devuelven una Date. El código que llama getCurrentTimesiempre va a necesitar, sea consciente de que está llamando a una función que devuelve un resultado asíncrona.

La forma más sencilla que suelen tratar con esto es mediante la definición de una interfaz de devolución de llamada personalizados para el tipo:

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

A continuación, puede pasar a una devolución de llamada en getCurrentTimeque su aplicación llama a continuación, cuando se hizo la hora actual de las funciones de la nube. Algo como:

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

Y luego que se dice con:

getCurrentTime(this, new DateCallback() {
  public void onCallback(Date value) {
    System.out.println("Current time "+value)
  }
});

Ver también:

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=351941&siteId=1
Recomendado
Clasificación