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 为空,因为它在侦听器外部使用f"名称"并且变量"名称"有问题,但在侦听器中它显示正确的值。

这违背了异步的本质。

最好将下一个方法/逻辑链接在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

最新更新