繁体   English   中英

如何强制AuthStateListener在ValueEventListener之后运行?

[英]How do I force an AuthStateListener to run after a ValueEventListener?

不好意思的标题表示歉意,但没有明确的方法将我的问题一字不漏。

对于初学者,我知道ValueEventListeners和AuthStateListeners异步运行,这正是我遇到此问题的原因。 这是我的一般代码结构,在应用程序启动时运行的方法中:

private static List<Student> students = new ArrayList<>();
private static List<Advisor> advisors = new ArrayList<>();
private static List<Chapter> chapters = new ArrayList<>();

static void initialize(Activity activity) {
    sdb.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot data) {
            for (DataSnapshot user : data.getChildren()) if (getStudentById(user.getKey()) == null) {
                // Adds data to students list
            }
        }
        @Override public void onCancelled(@NonNull DatabaseError databaseError) {}
    });
    adb.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot data) {
            for (DataSnapshot user : data.getChildren()) if (getAdvisorById(user.getKey()) == null) {
                // Adds data to advisors list
            }
        }
        @Override public void onCancelled(@NonNull DatabaseError databaseError) {}
    });
    cdb.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot data) {
            for (DataSnapshot chapter : data.getChildren()) if (getChapterById(chapter.getKey()) == null) {
                // Adds data to chapters list
            }
        }
        @Override public void onCancelled(@NonNull DatabaseError databaseError) {}
    });
    auth.addAuthStateListener(firebaseAuth -> {
        // Takes data from the students, advisors, and/or chapters list and updates a TextView
    });
}

您可以看到ArrayLists被初始化为空列表,并且三个ValueEventListeners从数据库中获取数据并将其添加到适当的列表中。 然后,AuthStateListener应该从那些列表中获取数据,并使用它来更新方法调用中传递的Activity中的TextView。

但是,由于所有这些侦听器都是异步运行的,因此结果表明,当应用程序首次加载时,AuthStateListener在ArrayLists 进行查询之前 ValueEventListeners可以对其进行更新,并且我收到一个NullPointerException,该异常使我的应用程序崩溃。 我如何解决这些侦听器的异步性,并在AuthStateListener首次运行其代码之后强制AuthStateListener的首次运行? 我不必关心其他时间会发生什么,但是对于初始化,只需要保留此顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM