グローバル変数と内側の関数からヌル文字列を取得します

玉里栗:

plsはイムは、あなたがそれを行うことができ、少しの問題で私を助けて:D

イムは、フィールド「CASE_NUMBER」とfirestoreドキュメント「user_cases_information」のフィールドを設定しようとしています

  1. まず私は、このグローバルなVARを宣言します

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=参照を、連続したフィールドが常にありますnull

なぜイムは、このヌルを取得しますか?私はトーストを使用して、この前にそれを置きます:

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

それが表示されnullた値またはデータは、上記の関数の内部失っているように、

私はこれをどのように修正することができます?本当にありがとうございます。

a_local_nobody:

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から実際の値を取得することはありませんされています。

ここに私の答えを見てみましょう:Javaで配列リストにFacebookのグラフAPIの結果を追加する方法と、私はあなたが助けを必要とする場合は、似た何かを作るお手伝いします

ここにあなたが行うことができるものです。

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

編集します

私が質問のこれらのタイプのために特別にこのポストを作りました:アンドロイドの任意の非同期操作からデータを取得する方法

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=233867&siteId=1