Conseguir cadena nula de la función interior con variable global

yuli castaño :

pls que me ayude con pequeño problema, estoy seguro de que puede hacerlo: D

Im tratando de configurar un campo en un documento FireStore "user_cases_information" con un campo "case_number"

  1. En primer lugar me declaro esta var mundial

private String case_number_consecutive = new String("");

  1. en el .setOnClickListenerque tengo esto: (a leer un número consecutivo de edad o el caso de otro documento)
if (service_type.equals("support")){
    DocumentReference docRef = firestore_popup.collection("param_data_app").document("support_case_numbers");
    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
     @Override
     public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                 DocumentSnapshot document = task.getResult();
                 String consecutive = document.get("consecutive").toString();
                    if (consecutive.equals(null)) {
                         int random = new Random().nextInt(117) + 4;
                         case_number_consecutive = "IOC-09"+random;
                    } else {
                        case_number_consecutive = consecutive;                                        UpdateCaseNumbersConsecutive("support");
                    }
             } else {
                  int random = new Random().nextInt(117) + 4;
                  case_number_consecutive = "IOC-09"+random;
              }
      }
     });
} 


Map<String, Object> user_cases_information = new HashMap<>();
user_cases_information.put("case_number", case_number_consecutive);
... (then i use a firestore reference to put the new case number)

Se supone que cuando verifico FireStore, precisamente, el documento donde hice el documento "user_cases_information", que debería ver el número o el nuevo case_number, pero siempre me dan una nullreferencia, el campo consecutivos es siempre =null

¿Por qué im conseguir este nula? He utilizado un pan tostado y lo puse antes de esto:

Toast.makeText(...."Value: "+case_number_consecutive
Map<String, Object> user_cases_information = new HashMap<>();
user_cases_information.put("case_number", case_number_consecutive);

y mostrar nulllo que el valor o los datos se pierden dentro de las funciones anteriores

¿¿¿Cómo puedo arreglar esto??? muchas gracias.

a_local_nobody:

La razón de esto, se debe a base de fuego se ejecuta de forma asíncrona, y que son la codificación como si todo sucede de forma sincrónica. Qué significa esto ? Esto significa que la llamada base de fuego no respondió de inmediato a un valor desde el servidor, se necesita algún tiempo para conseguir ese valor, pero el resto de su código se ejecuta antes de la respuesta viene de vuelta, y es por eso que usted está teniendo problemas. Así, a pesar de que este código se ejecuta:

if (service_type.equals("support")){
    DocumentReference docRef = firestore_popup.collection("param_data_app").document("support_case_numbers");
    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
     @Override
     public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                 DocumentSnapshot document = task.getResult();
                 String consecutive = document.get("consecutive").toString();
                    if (consecutive.equals(null)) {
                         int random = new Random().nextInt(117) + 4;
                         case_number_consecutive = "IOC-09"+random;
                    } else {
                        case_number_consecutive = consecutive;                                        UpdateCaseNumbersConsecutive("support");
                    }
             } else {
                  int random = new Random().nextInt(117) + 4;
                  case_number_consecutive = "IOC-09"+random;
              }
      }
     });
} 

por el momento llega una respuesta, el otro código:

Map<String, Object> user_cases_information = new HashMap<>();
user_cases_information.put("case_number", case_number_consecutive);

Ya se ha completado y llamado, y entonces nunca obtener el valor real de la base de fuego.

echar un vistazo a mi respuesta aquí: ¿Cómo añadir resultados de Facebook Graph API para lista de arreglo en Java y voy a ayudarle a hacer algo similar si necesita ayuda

aquí hay algo que puede hacer:

interface Callback{
        void firebaseResponseCallback(String result);//whatever your return type is.
    }

cambiar la firma de este método, a ser algo como esto:

public void getCaseNumber(Callback callback) { 

cambiar el código para esto:

if (service_type.equals("support")){
    DocumentReference docRef = firestore_popup.collection("param_data_app").document("support_case_numbers");
    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
     @Override
     public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                 DocumentSnapshot document = task.getResult();
                 String consecutive = document.get("consecutive").toString();
                    if (consecutive.equals(null)) {
                         int random = new Random().nextInt(117) + 4;
                         case_number_consecutive = "IOC-09"+random;
                    } else {
                        case_number_consecutive = consecutive;                                        UpdateCaseNumbersConsecutive("support");
                    }
             } else {
                  int random = new Random().nextInt(117) + 4;
                  case_number_consecutive = "IOC-09"+random;
              }

       callback.firebaseResponseCallback(case_number_consecutive);
      }
     });
} 

a continuación, cuando se llama getCaseNumber:

getCaseNumber(new Callback() {
        @Override
        public void firebaseResponseCallback(String result) {
            here, this result parameter that comes through is your api call result to use, so result will be your case number, so make your objects inside this method, not outside
        }
    });
}

Editar

He hecho este post específicamente para este tipo de preguntas: ¿Cómo conseguir los datos de cualquier operación asíncrona en Android

Supongo que te gusta

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