【问题标题】:How to assign data from Cloud Firestore to a global variable for Android [duplicate]如何将 Cloud Firestore 中的数据分配给 Android 的全局变量 [重复]
【发布时间】:2021-03-07 03:48:33
【问题描述】:

我使用 docRef.get() 从 Cloud Firestore 获取集合的地图。但是,离开public void onSuccess(DocumentSnapshot documentSnapshot) 方法后,我无法使用地图中的值。在 JS 中,我知道我可以执行 subscribe 方法,但在 Android 中我不知道该怎么做。

这是我获取地图的代码:

docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                if(documentSnapshot.exists()){
                    doc = documentSnapshot.getData();
                    Toast.makeText(ChatActivity.this,"Data loaded",Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(ChatActivity.this,"No data exists",Toast.LENGTH_SHORT).show();
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(ChatActivity.this, "Error", Toast.LENGTH_SHORT).show();
                Log.d("TAG",e.toString());
            }
        });

之后我想使用地图,将textView 设置为message

for(String key : doc.keySet()){
    message += key + "\n" + doc.get(key)+"\n";
} 
ui.setText(message);

【问题讨论】:

标签: java android database firebase google-cloud-firestore


【解决方案1】:

正如@a_local_nobody 指出的那样,Firestore 调用是Asynchronous,您可以在下载该数据时使用callback 触发,这是有责任的。 一旦执行了onSuccess 回调,您的doc 变量就会处理此数据,但您的代码的其他部分可能会在调用onSuccess 之前使用它(异步)。

另一种方法是将您的代码包装到一个方法中并在 onSuccess 主体回调中使用它们,因此您可以确定该方法将在数据可分配时执行并且您不需要额外的接口将其用作回调:

public void setMessagesToUi(Doc doc){
for(String key : doc.keySet()){
    message += key + "\n" + doc.get(key)+"\n";
} 
ui.setText(message);
}

然后使用它:

docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                if(documentSnapshot.exists()){
                    setMessagesToUi(documentSnapshot.getData());
                    Toast.makeText(ChatActivity.this,"Data loaded",Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(ChatActivity.this,"No data exists",Toast.LENGTH_SHORT).show();
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(ChatActivity.this, "Error", Toast.LENGTH_SHORT).show();
                Log.d("TAG",e.toString());
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多