static double lat2;
static double lon2;
private void InitMapElements() {
DatabaseReference zonesRef = FirebaseDatabase.getInstance().getReference("markers");
DatabaseReference zone1Ref = zonesRef.child("m-1"); //database path
DatabaseReference zone1NameRef = zone1Ref.child("latit");
DatabaseReference zone2NameRef = zone1Ref.child("longit");
zone1NameRef.addValueEventListener(new ValueEventListener() { //reading the first coordinate
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Double lat1 = dataSnapshot.getValue(Double.class);
lat2 = lat1;
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
}
});
zone2NameRef.addValueEventListener(new ValueEventListener() { //reading the second coordinate
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Double lon1 = dataSnapshot.getValue(Double.class);
lon2 = lon1;
}
@Override
public void onCancelled(DatabaseError error) {
}
});
}
不可能在线获取两个变量,然后将其从 Firebase 实时数据库保存到静态变量,这些变量仅在调用方法时获取一次值。只要有一个变量,一切就可以正常工作。如果您更改基数上的值,变量就会更改,但更改两个值则不起作用。
最佳答案
无需附加两个监听器即可获取这两个值。一个听众就可以解决您的问题。要解决此问题,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child("markers").child("m-1");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
double lat = dataSnapshot.child("latit").getValue(Double.class);
double lon = dataSnapshot.child("longit").getValue(Double.class);
Log.d(TAG, lat + ", " + lon);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
ref.addListenerForSingleValueEvent(valueEventListener);
如您所见,这两个值都是从 DataSnapshot
对象中提取的。由于此方法的异步行为,变量 lat
和 lon
只能在回调内部、onDataChange()
内可用。如果您想在室外使用它们,我建议您查看此 post 中我的答案的最后部分。 其中我解释了如何使用自定义回调来完成它。您还可以看看这个video 为了更好地理解。
关于java - 如何从Firebase实时数据库获取两个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53336613/