Android- 在取值的 method/listener 之外使用变量值
Android- Using variable value outside method/listener where it takes value
我目前正在做一些学校 android 项目,我需要 help.I 具有在数据库侦听器中获取一些值的变量,我必须在 listener.Can 之外使用该值,你好帮助我找到正确初始化的方法并使用 variable.Thank 你
我的代码如下
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 "names" 并且变量 "names" 是问题,但在侦听器中它显示正确的值.
这违背了异步的本质。
最好将下一个方法/逻辑链接到 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
我目前正在做一些学校 android 项目,我需要 help.I 具有在数据库侦听器中获取一些值的变量,我必须在 listener.Can 之外使用该值,你好帮助我找到正确初始化的方法并使用 variable.Thank 你 我的代码如下
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 "names" 并且变量 "names" 是问题,但在侦听器中它显示正确的值.
这违背了异步的本质。
最好将下一个方法/逻辑链接到 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