java– 等待检索Firestore数据以启动活动

java– 等待检索Firestore数据以启动活动,第1张

概述我已经制作了一个POJO对象列表,它从我的CloudFirestore数据库中获取值.此List本身就是一个类,每次创建新List时都要检索属性.问题是列表没有填写在创建活动上,而是在时间之后.我已经尝试添加循环,任务,等待,但没有得到所需的结果.以下是我如何令人满意地检索我的数据:privatevoi

我已经制作了一个POJO对象列表,它从我的Cloud Firestore数据库中获取值.此List本身就是一个类,每次创建新List时都要检索属性.问题是列表没有填写在创建活动上,而是在时间之后.我已经尝试添加循环,任务,等待,但没有得到所需的结果.以下是我如何令人满意地检索我的数据:

private voID retrIEveData(){        reference = firestore.collection("attractions");        reference.addSnapshotListener(new EventListener<querySnapshot>() {            @OverrIDe            public voID onEvent(@Nullable querySnapshot querydocumentSnapshots,                                @Nullable FirebaseFirestoreException e) {                attractionList.clear();                for (documentSnapshot snapshot : querydocumentSnapshots) {                    Attraction attraction = snapshot.toObject(Attraction.class);                    addAttractions(attraction);                }            }        });    }

每次创建新对象时都会检索数据:

public AttractionList() {        firestore.setFirestoresettings(settings);        reference = firestore.collection("attractions");        attractionList = new ArrayList<>();        retrIEveData();    }

然后,如果我在创建的活动上检查列表大小:

@OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_attraction);        Toolbar toolbar = findVIEwByID(R.ID.tb_attraction);        setSupportActionbar(toolbar);        //Creating POJO List and retrIEving data        attractionList = new AttractionList();        Log.e("List Size: ", ""+attractionList.getAttractionList().size());        //List Size: 0    }

但如果我在任何按钮后使用相同的日志时间:

@OverrIDe    public voID onBackpressed(){        Log.e("List Size: ", ""+attractionList.getAttractionList().size());        //List Size: 16    }

我真的不想在每个Activity中检索数据或创建意图以在活动之间引入Object.有什么办法可以解决这个问题吗?

PS:这是我的第一篇文章.对不起,如果我没有以正确的方式做到这一点.非常感谢.

解决方法:

您现在无法使用尚未加载的内容. Firestore异步加载数据,因为这可能需要一些时间.根据您的连接速度和状态,可能需要几百毫秒到几秒才能获得数据.如果要将类型为Attraction的对象列表传递给另一个方法,只需在onSuccess()方法中调用该方法并将该列表作为参数传递.所以快速解决这个问题:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();CollectionReference attractionsRef = rootRef.collection("attractions");attractionsRef.get().addOnCompleteListener(new OnCompleteListener<querySnapshot>() {    @OverrIDe    public voID onComplete(@NonNull Task<querySnapshot> task) {        if (task.isSuccessful()) {            List<Attraction> attractionsList = new ArrayList<>();            for (querydocumentSnapshot document : task.getResult()) {                Attraction attraction = document.toObject(Attraction.class);                attractionsList.add(attraction);            }            methodtoprocesstheList(attractionsList);        }    }});

所以请记住,onSuccess()方法具有异步行为,这意味着甚至在从数据库获取数据之前就会调用它.如果要在该方法之外使用attractionsList,则需要创建自己的回调.要实现这一点,首先需要创建一个这样的接口:

public interface MyCallback {    voID onCallback(List<Attraction> attractionsList);}

然后,您需要创建一个实际从数据库获取数据的方法.此方法应如下所示:

public voID readData(MyCallback myCallback) {    attractionsRef.get().addOnCompleteListener(new OnCompleteListener<querySnapshot>() {        @OverrIDe        public voID onComplete(@NonNull Task<querySnapshot> task) {            if (task.isSuccessful()) {                List<Attraction> attractionsList = new ArrayList<>();                for (querydocumentSnapshot document : task.getResult()) {                    Attraction attraction = snapshot.toObject(Attraction.class);                    attractionsList.add(attraction);                }                myCallback.onCallback(attractionsList);            }        }    });}

最后,只需调用readData()方法并将MyCallback接口的实例作为参数传递到您需要的地方,如下所示:

readData(new MyCallback() {    @OverrIDe    public voID onCallback(List<Attraction> attractionsList) {        //Do what you need to do with your List    }});

这是您可以在onSuccess()方法之外使用attractionsList对象的唯一方法.有关更多信息,您还可以查看此video.

总结

以上是内存溢出为你收集整理的java – 等待检索Firestore数据以启动活动全部内容,希望文章能够帮你解决java – 等待检索Firestore数据以启动活动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1104908.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存