java-从具有全局变量的内部函数中获取空字符串

java-从具有全局变量的内部函数中获取空字符串,第1张

概述请帮我一点问题,我确定你可以做到:D我正在尝试在Firestore文档“user_cases_information”上使用字段“case_number”设置一个字段>首先,我声明这个全局变量私有字符串case_number_consecutive=newString(“”);>在.setOnClickListener中,我有以下内容:(从其他文档中读取旧

请帮我一点问题,我确定你可以做到:D

我正在尝试在Firestore文档“ user_cases_information”上使用字段“ case_number”设置一个字段

>首先,我声明这个全局变量

私有字符串case_number_consecutive = new String(“”);

>在.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

为什么我得到这个空值?我用烤面包,然后放在它之前:

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

并且它显示为null,因此上述函数中的值或数据丢失

我怎样才能解决这个问题???非常感谢.

解决方法:

这样做的原因是因为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

总结

以上是内存溢出为你收集整理的java-从具有全局变量的内部函数中获取空字符串全部内容,希望文章能够帮你解决java-从具有全局变量的内部函数中获取空字符串所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1094581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存