我正在使用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 的最后一部分,其中我解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地了解。