为什么此ArrayList对象在代码的特定位置变为空白?

时间:2019-04-07 09:03:32

标签: android arraylist

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]

2 个答案:

答案 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中看到的值。