首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法在Android的同一个类中的方法之间传值

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

Stack Overflow用户
提问于 2018-06-30 08:42:30
回答 3查看 74关注 0票数 5

我尝试在两个方法之间传递一个值,按照这里的不同解决方案,但传递的是null。

对我试图传递的代码执行操作:

代码语言:javascript
复制
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) {}
    });
}

我试图将“”值传递给的位置:

代码语言:javascript
复制
private void recordData(String riderId) {

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

    ...
}

getPrice()中的价格值是假定的值,但是当我打印出recordData()中的值时,该值= null

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-30 09:08:30

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

但您的问题来自于方法的优先级。当您调用recordData时,该值还不在那里。

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

代码语言:javascript
复制
Log.d(TAG, "recordData: price = " + price);

将在此之前:

代码语言:javascript
复制
Log.d(TAG, "getPrice: price = " + price);

因此,最好的办法是要么在确切知道值已经准备好时执行recordData,要么在onDataChange内部调用它。

票数 2
EN

Stack Overflow用户

发布于 2018-06-30 09:12:40

使用回调作为getter的一部分

代码语言:javascript
复制
private void getPrice(ValueEventListener listener) {
    DatabaseReference dbRequest = FirebaseDatabase.getInstance().getReference(Common
            .request_tbl).child(riderId).child("details"); // "Requests"
    dbRequest.addValueEventListener(listener);
}

就叫它

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2018-06-30 09:13:35

您的getData未获取任何数据。它只设置一个侦听器,该侦听器将在发生onDataChanged事件时执行。(当某些数据发生变化时)。

目前,它所做的是-它设置侦听器等待来自recordData的onDataChanged事件,然后立即打印出尚未初始化或更改的价格。

如果你想执行recordData方法,你应该在数据发生变化后再执行。

换句话说,它应该是这样的:

代码语言:javascript
复制
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) {}
});
}

然后

代码语言:javascript
复制
private void recordData(double newPrice) {


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

// do other data recording operations
...
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51110846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档