【问题标题】:Getting null string from inner function with global variable使用全局变量从内部函数获取空字符串
【发布时间】:2019-08-01 04:35:35
【问题描述】:

请帮我解决一些小问题,我相信你能做到:D

我正在尝试在 Firestore 文档“user_cases_information”上设置一个字段,其中包含一个字段“case_number”

  1. 首先我声明这个全局变量

private String case_number_consecutive = new String("");

  1. .setOnClickListener 我有这个:(从其他文档中读取旧的连续编号或案例编号)
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)

假设当我检查firestore时,正是我设置“user_cases_information”文档的文档,我应该看到数字或新的case_number,但我总是得到一个null参考,连续的字段总是=@ 987654325@

为什么我得到这个空值?我用了一个 Toast 并把它放在这之前:

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

它显示null,因此上述函数中的值或数据正在丢失

我该如何解决这个问题???十分感谢。

【问题讨论】:

  • 是否调用了onComplete

标签: java android firebase google-cloud-firestore


【解决方案1】:

之所以这样,是因为 firebase 是异步执行的,而您在编码时就好像这一切都是同步发生的。这是什么意思 ?这意味着 firebase 调用不会立即从服务器返回值,获取该值需要一些时间,但是您的其余代码在响应返回之前正在执行,这就是您遇到问题的原因。所以,即使这段代码执行:

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

已经完成并调用,然后你永远不会从 firebase 获得实际值。

看看我的回答:How to add results of Facebook Graph api to array list in Java,如果你需要帮助,我会帮你做类似的事情

这是你可以做的事情:

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

更改此方法的签名,如下所示:

public void getCaseNumber(Callback callback) { 

将您的代码更改为:

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

那么,当你打电话给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
        }
    });
}

编辑

我专门针对这些类型的问题发表了这篇文章: How to get data from any asynchronous operation in android

【讨论】:

  • 非常感谢,这绝对解决了我的问题:D
【解决方案2】:

您在该代码中犯了一个错误。 根据firebase最新版本,您只能在.addOnCompleteListener/.addValueEvent/etc函数内部使用firebase数据库的值/字符串。

  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()) {

/////////////////////////////call here everything related to it////////////////////////

                                            }
                                        });
                                    } 

在firebase之外添加完整的监听器或添加值监听器,变量或对象的值不会改变或保持不变!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-14
    • 2022-08-02
    • 2023-03-19
    • 1970-01-01
    • 2012-07-15
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多