2 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
這樣做的原因是因?yàn)?firebase 是異步執(zhí)行的,而您在編碼時(shí)就好像這一切都是同步發(fā)生的一樣。這是什么意思 ?這意味著 firebase 調(diào)用不會(huì)立即從服務(wù)器返回值,獲取該值需要一些時(shí)間,但是在響應(yīng)返回之前您的其余代碼正在執(zhí)行,這就是您遇到問(wèn)題的原因。所以,即使這段代碼執(zhí)行:
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;
? ? ? ? ? ? ? }
? ? ? }
? ? ?});
}?
當(dāng)響應(yīng)返回時(shí),您的其他代碼:
Map<String, Object> user_cases_information = new HashMap<>();
user_cases_information.put("case_number", case_number_consecutive);
已經(jīng)完成并被調(diào)用,然后你永遠(yuǎn)不會(huì)從 firebase 獲得實(shí)際值。
這是你可以做的事情:
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);
? ? ? }
? ? ?});
}?
然后,當(dāng)你打電話時(shí)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
? ? ? ? }
? ? });
}

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
您在該代碼中犯了一個(gè)錯(cuò)誤。根據(jù) firebase 最新版本,您只能在 .addOnCompleteListener/.addValueEvent/etc 函數(shù)中使用 firebase 數(shù)據(jù)庫(kù)的值/字符串。
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 外部添加完整監(jiān)聽(tīng)器或添加值監(jiān)聽(tīng)器,變量或?qū)ο笾挡粫?huì)改變或保持不變!
添加回答
舉報(bào)