我的函数在内部 class 中的代码完成之前返回一个值
My function iss returning a value before the code in the inner class finishes
我正在使用 java 编写一个 android 应用程序。我把它连接到实时数据库。我正在尝试搜索我的数据并检查其中是否存在某个键。
public boolean checkForKey(String key) {
final boolean[] found = {false};
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot: snapshot.getChildren()){
if(dataSnapshot.getKey().equals(key)) {
found[0] = true;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
};
dbRef.child("Polls").addValueEventListener(listener);
return found[0];
}
函数在完成实际搜索数据库的代码部分之前返回 false。感谢任何帮助解释为什么会发生这种情况。
来自docs:
onDataChange
: This method will be called with a snapshot of the data at this location. It will also be called each time that data changes.
当数据发生变化时,方法中的任何内容都会被执行。换句话说,方法onDataChange
指示程序在获得结果时(可能是任何时候)做什么
这是异步行为 - 正如@Turing85 指出的那样,这只会在数据更改时调用。
如果您想知道是否存在具有此键的内容,您可以构造一个查询,然后调用 get()
方法,该方法会 return 一个 Task<DataSnapshot>
。对于 this task,您可以附加 addOnCompleteListener
侦听器来执行您想要的操作。这也是异步的,所以它只会 运行 当 有结果时。
我正在使用 java 编写一个 android 应用程序。我把它连接到实时数据库。我正在尝试搜索我的数据并检查其中是否存在某个键。
public boolean checkForKey(String key) {
final boolean[] found = {false};
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot: snapshot.getChildren()){
if(dataSnapshot.getKey().equals(key)) {
found[0] = true;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
};
dbRef.child("Polls").addValueEventListener(listener);
return found[0];
}
函数在完成实际搜索数据库的代码部分之前返回 false。感谢任何帮助解释为什么会发生这种情况。
来自docs:
onDataChange
: This method will be called with a snapshot of the data at this location. It will also be called each time that data changes.
当数据发生变化时,方法中的任何内容都会被执行。换句话说,方法onDataChange
指示程序在获得结果时(可能是任何时候)做什么
这是异步行为 - 正如@Turing85 指出的那样,这只会在数据更改时调用。
如果您想知道是否存在具有此键的内容,您可以构造一个查询,然后调用 get()
方法,该方法会 return 一个 Task<DataSnapshot>
。对于 this task,您可以附加 addOnCompleteListener
侦听器来执行您想要的操作。这也是异步的,所以它只会 运行 当 有结果时。