无法将firestore数据库中的值分配给变量

时间:2018-02-10 18:29:46

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

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

我想,关键是监听器异步完成任务,但我不知道它什么时候结束。我使用Thread.sleep“修复”了这个问题,但它不是解决方案。有没有人知道将字段值赋值给变量的正确方法?

abstract class Measurement : Cloneable {
  abstract val units: String
  abstract val value: Number

  fun unaryMinus() : Measurement {
      val measurement = this.clone() as Measurement
      return measurement
  }
}

1 个答案:

答案 0 :(得分:0)

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

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