[英]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.