我尝试在两个方法之间传递一个值,按照这里的不同解决方案,但传递的是null。
对我试图传递的代码执行操作:
private void getPrice() {
DatabaseReference dbRequest = FirebaseDatabase.getInstance().getReference(Common
.request_tbl).child(riderId).child("details"); // "Requests"
dbRequest.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
if (child.getKey().equals("price")) {
price = Double.valueOf(child.getValue().toString());
Log.d(TAG, "getPrice: price = " + price);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
我试图将“”值传递给的位置:
private void recordData(String riderId) {
getPrice();
Log.d(TAG, "recordData: price = " + price);
...
}
getPrice()中的价格值是假定的值,但是当我打印出recordData()中的值时,该值= null
发布于 2018-06-30 09:08:30
在注释中回答您的问题:您不必传递括号内的参数,因为您正在设置一个回调。
但您的问题来自于方法的优先级。当您调用recordData
时,该值还不在那里。
场景是,在recordData
中,您执行getPrice()
行,但是执行并不等待getPrice()
完成,因为它是一个回调函数,一旦检索到该值,就会立即返回该值,这可能会持续很长时间。为了证明这一点,你可以查看你的日志。这个日志很可能是:
Log.d(TAG, "recordData: price = " + price);
将在此之前:
Log.d(TAG, "getPrice: price = " + price);
因此,最好的办法是要么在确切知道值已经准备好时执行recordData
,要么在onDataChange
内部调用它。
发布于 2018-06-30 09:12:40
使用回调作为getter的一部分
private void getPrice(ValueEventListener listener) {
DatabaseReference dbRequest = FirebaseDatabase.getInstance().getReference(Common
.request_tbl).child(riderId).child("details"); // "Requests"
dbRequest.addValueEventListener(listener);
}
就叫它
getPrice(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
if (child.getKey().equals("price")) {
price = Double.valueOf(child.getValue().toString());
Log.d(TAG, "getPrice: price = " + price);
// Call a separate function that actually needs the price here
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Don't ignore your errors!
}
);
// Note: price will still be null here
发布于 2018-06-30 09:13:35
您的getData未获取任何数据。它只设置一个侦听器,该侦听器将在发生onDataChanged事件时执行。(当某些数据发生变化时)。
目前,它所做的是-它设置侦听器等待来自recordData的onDataChanged事件,然后立即打印出尚未初始化或更改的价格。
如果你想执行recordData方法,你应该在数据发生变化后再执行。
换句话说,它应该是这样的:
private void setUpListenerForPrice() {
DatabaseReference dbRequest = FirebaseDatabase.getInstance().getReference(Common
.request_tbl).child(riderId).child("details"); // "Requests"
dbRequest.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
if (child.getKey().equals("price")) {
price = Double.valueOf(child.getValue().toString());
// call data recording from the listener, after the price acquires a values.
recordData(price);
// Log.d(TAG, "getPrice: price = " + price);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
然后
private void recordData(double newPrice) {
Log.d(TAG, "recordData: price = " + newPrice);
// do other data recording operations
...
}
https://stackoverflow.com/questions/51110846
复制相似问题