Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在Android中同一类中的方法之间传递值_Java_Android_Firebase Realtime Database - Fatal编程技术网

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

Java 无法在Android中同一类中的方法之间传递值,java,android,firebase-realtime-database,Java,Android,Firebase Realtime Database,我已经尝试通过在这里使用不同的解决方案在两个方法之间传递一个值,但是传递null 我试图传递的代码: private void getPrice() { DatabaseReference dbRequest = FirebaseDatabase.getInstance().getReference(Common .request_tbl).child(riderId).child("details"); // "Requests" dbRequest.

我已经尝试通过在这里使用不同的解决方案在两个方法之间传递一个值,但是传递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);

    ...
}
我试图将值“price”传递给:

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

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

但是你的问题来自方法的优先性。调用
recordData
时,该值还不存在

场景是,在
recordData
中执行行
getPrice()
,但执行不会等待
getPrice()
完成,因为这是一个回调,一旦检索到该值,就会返回该值,这可能需要很长时间。为了证明这一点,你可以看看你的日志。此日志可能会:

Log.d(TAG, "recordData: price = " + price);
将在此之前:

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

因此,您最好的选择是在确切知道值已准备好时执行
recordData
,或者在
onDataChange
内部调用它

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

调用该
Log
行时,您的
ValueEventListener.onDataChange
方法可能尚未被调用,因为它是一个异步处理。回调方法的基本意思是“无论何时发生这种情况,都要执行X”。当您的日志行假定变量已被该回调中的值填充时。是的,将调用该变量。我有一个按钮,当我按下这个按钮时,它调用recordData()。。我已经运行了多次相同的解析。您正在设置回调。在您调用
recordData
时,数据可能根本没有准备好,这就是为什么
onDataChange
中的
Log
可以工作,而
recordData
中的
Log
不能工作的原因。事实上,一旦骑手请求参加另一项活动,数据会首先添加到数据库中,然后数据被写入数据库,我试图通过调用recordData()从数据库中检索数据并将其放置在数据库的其他位置。哦,好的。而在
onDataChanged
中,Double.valueOf(child.getValue().toString())是
Double.valueOf返回值?成功了!我所做的是将recordData()放在getPrice()中的ValueListener中,它可以工作。:)@丽兹:太好了很高兴我能帮忙。祝你好运