我尝试按照此处的不同解决方案在2个方法之间传递值,但传递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()中的price值应该是预期值,但是当我打印出recordData()中的值时,该值= null
答案 0 :(得分:2)
在评论中回答您的问题:您无需在方括号内传递参数,因为您正在设置回调。
但是您的问题来自方法的优先级。调用recordData
时该值尚不存在。
该场景是,在recordData
中执行第getPrice()
行,但是执行不会等待getPrice()
完成,因为它是一个回调,并且该值将返回为尽快将其检索到,这可能需要很长时间。为了证明这一点,您可以查看您的日志。可能是该日志:
Log.d(TAG, "recordData: price = " + price);
将在此之前:
Log.d(TAG, "getPrice: price = " + price);
因此,最好的选择是在确切知道值已准备就绪时执行recordData
,或在onDataChange
内部调用它。
答案 1 :(得分:1)
将回调用作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
答案 2 :(得分:1)
您的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
...
}