无法在 Android 中同一类中的方法之间传递值



我尝试通过遵循此处的不同解决方案在 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(( 中的价格值是它应该的样子,但是当我打印出 recordData(( 中的值时,值 = null

在评论中回答您的问题:您不必在括号内传递参数,因为您正在设置回调。

但是你的问题来自方法的优先级。当您调用recordData时,该值尚不存在。

场景是,recordData执行行getPrice(),但执行不会等待getPrice()完成,因为它是一个回调,并且该值将在检索后立即返回,这可能是很久之后。为了证明这一点,您可以查看您的日志。此日志很可能:

Log.d(TAG, "recordData: price = " + price);

将在此之前:

Log.d(TAG, "getPrice: price = " + price);

因此,最好的办法是在确切知道值已准备就绪时执行recordData,或者在onDataChange中调用它。

将回调用作 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

您的 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
...
}

最新更新