如何从监听器获取数据?



我正在使用Android,iOS和Firebase跨平台开发我的应用程序。在 iOS 应用程序中,我可以选择让司机对请求的乘车使用出价,而在 android 应用程序中,这只是一个计算的价格。

如果 Android 乘客通过 iOS 合作车主叫车,iOS 合作车主可以提供折扣出价,而不是计算出的行程价格。

在Firebase的RideRequests节点中,它会添加ridePrice作为要支付的价格,但如果它是出价,它还会添加出价。我正在尝试设置它,如果"rideBidPrice"存在,那么rideAmt = rideBidPrice但如果不存在,那么rideAmt = ridePrice

不幸的是,我正在做的是没有达到PayPalPayment方法。

我该怎么做?

火力基地数据库:

"RideRequests" : {
"buIpWNEFgmZJWN3jIB9IwS8r74d2" : { // rider Id
"archiveTimestamp" : "2019-03-17 22:00",
"currentAddress" : "2 Peel Plaza",
"destAddress" : "Courtenay Bay Causeway",
"destLat" : 47.277879500000004,
"destLong" : -63.04432369999999,
"driver" : "Dean Winchester",
"driverID" : "nD1v8oxHv3ObdQAKeKjuTt6f5TL2",
"rideBidPrice" : 5.74,
"ridePrice" : 8.38,
"riderPaid" : "false",
"status" : "driverBid",
"userId" : "buIpWNEFgmZJWN3jIB9IwS8r74d2",
"username" : "riderANDROID"
}

法典:

private void checkForBids() {
Log.e(TAG, "checkForBids");
DatabaseReference bids = FirebaseDatabase.getInstance().getReference(Common.request_tbl)
.child(riderId).child("rideBidPrice");
bids.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
bidPrice = dataSnapshot.getValue(Double.class);
if (bidPrice != null) {
rideAmt = bidPrice;
} else {
rideAmt = ridePrice;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}

private void payPalPayment() {
Log.e(TAG, "payPalPayment");
PayPalPayment payment = new PayPalPayment(new BigDecimal(rideAmt),
"CAD", "Ryyde Payment ", PayPalPayment.PAYMENT_INTENT_SALE);
// PaymentActivity is created by PayPal API
Intent intent = new Intent(this, PaymentActivity.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
intent.putExtra(PaymentActivity.EXTRA_PAYMENT, payment);
startActivityForResult(intent, PAYPAL_REQUEST_CODE);
}

我还尝试将 payPalPayment 方法放入块中,但由于意图而不起作用。

编辑 #1

这有效:

根据@AlexMamo帖子到下面的帖子:

如何返回数据快照值作为方法的结果?

我添加了一个接口:

public interface MyCallback {
void onCallback(Double value); 
}

实际从数据库获取数据的方法:

public void readData(final MyCallback myCallback) {
Log.e(TAG, "readData");
DatabaseReference bids = FirebaseDatabase.getInstance().getReference(Common.request_tbl)
.child(riderId).child("rideBidPrice");
bids.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Double value = dataSnapshot.getValue(Double.class);
myCallback.onCallback(value);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}

然后我在PayPalPayment方法中调用该方法,如下所示:

private void payPalPayment() {
readData(new MyCallback() {
@Override
public void onCallback(Double value) {
PayPalPayment payment = new PayPalPayment(new BigDecimal(value),
"CAD", "Ryyde Payment ", PayPalPayment.PAYMENT_INTENT_SALE);
// PaymentActivity is created by PayPal API
Intent intent = new Intent(RiderHome.this, PaymentActivity.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
intent.putExtra(PaymentActivity.EXTRA_PAYMENT, payment);
startActivityForResult(intent, PAYPAL_REQUEST_CODE);
}
});
}

您无法将rideAmt创建为全局变量,而只需在payPalPayment()方法中使用它,因为 Firebase API 是异步的,这意味着该方法onDataChange()调用后会立即返回,并且它返回的任务的回调将在一段时间后调用。 无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此您尝试在onDataChange()方法外部使用它的rideAmt变量的值尚未从回调中填充。

基本上,您正在尝试从异步 API 同步使用rideAmt的值。这不是一个好主意。应按预期异步处理 API。

此问题的快速解决方案是将payPalPayment()方法中存在的所有逻辑直接移动到onDataChange()方法中。这样,您尝试获取的数据将在那时可用。

如果您需要在回调之外使用它,我建议您查看这篇文章中我的 anwser 的最后一部分,其中我解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地了解。

最新更新