android:无法在同一个类中的方法之间传递值

Liz*_*izG 5 java android firebase-realtime-database

我尝试在这里通过遵循不同的解决方案在两个方法之间传递一个值,但是传递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) {}
    });
}
Run Code Online (Sandbox Code Playgroud)

我试图将价值"价格"传递给:

private void recordData(String riderId) {

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

getPrice()中的price值是应该的,但是当我在recordData()中打印出值时,value = null

任何帮助将不胜感激.

Sul*_*man 2

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

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

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

Log.d(TAG, "recordData: price = " + price);
Run Code Online (Sandbox Code Playgroud)

将在这之前:

Log.d(TAG, "getPrice: price = " + price);
Run Code Online (Sandbox Code Playgroud)

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