我目前正在做一些学校的android项目,我需要帮助。我有变量在数据库监听器中占用一些值,我必须在监听器之外使用该值。你能帮我找到正确初始化和使用的方法那个变数。谢谢 我的代码在
之下 DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("user");
ref.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Get map of users in datasnapshot
names= getAllNames((Map<String,Object>) dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
//handle databaseError
}
});
String p= names.get(1);
这个方法getAllNames工作正常,我测试了它。在这种情况下,P是null,因为它使用的是&#34;名称&#34;外部听众和变量&#34;名称&#34;是问题,但在听众中它显示正确的价值。
答案 0 :(得分:0)
这违反了异步的本质。
如果你在onDataChange
中链接下一个方法/逻辑而不是从外部访问它,那就更好了。
但是,您可以使用Task
public Task<List<String>> getNames() {
TaskCompletionSource<String> task = new TaskCompletionSource<>();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("user");
ref.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Get map of users in datasnapshot
task.setResult(getAllNames((Map<String,Object>) dataSnapshot.getValue()));
}
@Override
public void onCancelled(DatabaseError databaseError) {
//handle databaseError
task.setException(new RuntimeException());
}
});
return task.getTask()
}
现在在您的方法中重复使用它:
Task<List<String>> task = getNames();
List<String> names = Tasks.await(task); // This will block till done