我为我的学校在android上创建了一个应用程序,但我阻止了异步问题:
databaseReference2.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(final DataSnapshot ds: dataSnapshot.getChildren()){
Log.e("test","1");
Menu = ds.getValue(menu.class);
list2.add(Menu.getId().toString());
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
try{
Log.e("test","2");
if(dataSnapshot.child("menuAjoute").child(mail).exists()){
if(dataSnapshot.child("menuAjoute").child(mail).child(Menu.getId()).getValue().equals(Menu.getId())) {
list.add(Menu.getNom());
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Log.e("test","3");
}
要使我的代码工作,第2步必须在第3步之前。但我还没有找到办法。什么是最简单的方法? (我搜索了解决方案,但没有一个工作)。
答案 0 :(得分:0)
Firebase侦听器是异步的,这意味着它不会等到数据被提取,这意味着将继续执行以下代码行,并且在某些时候它将从数据库中提取数据。我建议你将第3步放在听众中
try{
Log.e("test","2");
if(dataSnapshot.child("menuAjoute").child(mail).exists()){
if(dataSnapshot.child("menuAjoute").child(mail).child(Menu.getId()).getValue().equals(Menu.getId())) {
list.add(Menu.getNom());
}
}
}catch (Exception e) {
e.printStackTrace();
}
Log.e("test", "3")
答案 1 :(得分:0)
没有好办法在Android中强制等待。如果要在步骤3之前完成步骤2,则应将步骤2移到步骤2完成时调用的方法中。所以:
databaseReference2.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(final DataSnapshot ds: dataSnapshot.getChildren()){
Log.e("test","1");
Menu = ds.getValue(menu.class);
list2.add(Menu.getId().toString());
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
try{
Log.e("test","2");
if(dataSnapshot.child("menuAjoute").child(mail).exists()){
if(dataSnapshot.child("menuAjoute").child(mail).child(Menu.getId()).getValue().equals(Menu.getId())) {
list.add(Menu.getNom());
}
}
Log.e("test","3");
}catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
另见: