【问题标题】:Cannot assign the value from a firestore database to a variable [duplicate]无法将firestore数据库中的值分配给变量[重复]
【发布时间】:2018-02-10 18:29:45
【问题描述】:

我在为 OnSuccessListener 之外的变量赋值时遇到问题。正如您在代码中看到的,首先,我尝试将 abc 的值写入侦听器内部的日志,然后在侦听器完成工作后在外部调试相同字符串的值,但在日志文件中我首先看到“之后:null”并且仅在“result = testField”之后。

我想,关键是侦听器异步执行任务,但我不知道它何时完成。我使用 Thread.sleep '修复'了这个问题,但这不是解决方案。有谁知道将字段值分配给变量的正确方法?

    String abc; 
    private void getInfo(String uid) {     
       DocumentReference doc = FirebaseFireStore.getInstance().document("sb/base");
       store.collection("users").document(uid).get().addOnSuccessListener(
                new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                if (!documentSnapshot.exists())
                    log("onSuccess: EMPTY");
                else {
                    abc = new JSONObject(documentSnapshot.getData()).toString();
                    log("result = " + abc);
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(applicationManager.activity.getApplicationContext(),
                        "ERROR", Toast.LENGTH_SHORT).show();
            }
        });
      log("after: " + abc);
    }

【问题讨论】:

    标签: java android asynchronous listener google-cloud-firestore


    【解决方案1】:

    您使用的接口在此类操作中很常见。我已经修改了你的代码来演示这个概念。您将以这种方式使用代码:

    LoadDBData dataBaseAccessOp=new LoadDBData();
    //YOUR original function next
    dataBaseAccessOp.getInfo("uidSelected", new LoadingListener(){
      @Override
      void OnSuccess(String data){
         log("result = " + data);
      }
    
      @Override
      void OnFail(){
        log("result = ERROR");
        Toast.makeText(applicationManager.activity.getApplicationContext(), 
              "ERROR", Toast.LENGTH_SHORT).show();
      }
    });
    

    下面是修改后的代码。

    Kf

    public class LoadDBData {
    
      public interface LoadingListener{
         void OnSuccess(String data);
         void OnFail();
      }
    
      private void getInfo(String uid, LoadingListener usrListener) {         
        DocumentReference doc = FirebaseFireStore.getInstance().document("sb/base");
        store.collection("users").document(uid).get().addOnSuccessListener(
          new OnSuccessListener<DocumentSnapshot>() {
          @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
            if (documentSnapshot.exists()==true)        
              String abc = new JSONObject(documentSnapshot.getData()).toString();
              usrListener.OnSuccess(abc);
    
            }
          }
        }
        ).addOnFailureListener(new OnFailureListener() {
          @Override
            public void onFailure(@NonNull Exception e) {
              usrListener.OnFail();        
          }
        }
        );
      }
    }
    

    【讨论】:

    • 对我不起作用
    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 2020-11-21
    • 2021-02-08
    • 1970-01-01
    • 2021-07-04
    • 2020-01-13
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多