public List<String> itemLists = new ArrayList<>();
itemLists
在.addOnSuccessListener
内部取值(请参见 tagg1 , tagg2 , tagg3 )。但是,当离开.addOnSuccessListener
时,似乎变成空白(请参见 tagg4 )。
怎么可能?为什么会发生?
根据我的说法,这是因为 tagg4 是在.addOnSuccessListener
运行之前打印的。实际上,从Logcat
时间戳来看,似乎是这样。如果是这样,为什么在运行.addOnSuccessListener
之前打印 tagg4 ?在代码中,是在之后。
Java
public void searchTags() {
mRef.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
Store store = documentSnapshot.toObject(Store.class);
for (String tag : store.getTags()) {
itemLists.add(tag);
Log.d("tagg1", itemLists.toString());
}
Log.d("tagg2", itemLists.toString());
}
Log.d("tagg3", itemLists.toString());
}
});
Log.d("tagg4", itemLists.toString());
return;
}
Logcat
04-07 10:52:27.080 15268-15268/com.example.ves.gennaio3 D/tagg4: []
04-07 10:52:27.132 15268-15268/com.example.ves.gennaio3 D/tagg1: [nome]
[nome, indirizzo]
[nome, indirizzo, numero]
04-07 10:52:27.132 15268-15268/com.example.ves.gennaio3 D/tagg2: [nome, indirizzo, numero]
04-07 10:52:27.132 15268-15268/com.example.ves.gennaio3 D/tagg3: [nome, indirizzo, numero]
答案 0 :(得分:0)
onSuccessListener
中的代码不会立即执行。相反,这就是所谓的回调-它定义了程序在以后发生某件事时应该做什么。在这种特定情况下,onSuccess
的主体是在异步方法get()
成功完成时执行的(我从这里的上下文中假设,我真的不知道mRef
是什么还是什么get()
方法)。因此,您的事件顺序如下:
1)启动异步get()
方法并定义成功完成后的操作
2)记录tagg4
3)get()
成功完成,触发回调并将项添加到列表中
答案 1 :(得分:0)
实际上,在这里,在这种情况下,您具有addOnSuccessListener,它将侦听事件的更改,如果发生任何更改,则它将调用onSuccess,然后仅运行onSuccess中的代码。并且tagg4在onSuccess之外,因此在Java代码中逐行执行,并且这样做是一样的,仅当侦听器内部有调用时,才会执行onSuccess中的其余代码。
首先,您的项目列表为空,并且当侦听器addOnSuccessListener在其回调函数onSuccess中进行调用时,数据将存储在itemLists中,然后只有它们具有在Logcat中看到的值。