java—如何将CloudFireStore中的数据分配给android的全局变量

yshpjwxd  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(288)

这个问题在这里已经有答案了

为什么调用api的函数返回空值或空值(1个答案)
如何检查firestore中是否存在某个数据(1个答案)
如何作为方法的结果返回documentsnapshot(2个答案)
firebase firestore从集合中获取数据(6个答案)
上个月关门了。
我用 docRef.get() 从CloudFireStore获取收藏Map。但是,我离开后无法使用Map中的值 public void onSuccess(DocumentSnapshot documentSnapshot) 方法。在js,我知道我可以 subscribe 但是在android中我不知道该怎么做。
这是我获取Map的代码:

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

在那之后我想用Map来设定 textView 成为 message :

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

bis0qfac1#

作为一个没有人指出的地方, Firestore 电话是 Asynchronous 你需要一个 callback 当你下载了数据时触发,这是有争议的。你的 doc 变量在 onSuccess 回调是执行的,但可能您的代码的其他部分以前使用过它 onSuccess 称为(异步)。
另一种方法是将代码 Package 到一个方法中,并在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());
            }
        });

相关问题