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

时间:2018-06-30 00:42:30

标签: java android firebase-realtime-database

我尝试按照此处的不同解决方案在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

3 个答案:

答案 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
...
 }