如何从Android中的firebase返回值? [重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

public  void getFoodItem( String foodNum) {

    dbReference=firebaseDatabase.getReference("Food"+foodNum);

    dbReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            FoodItem foodItem = dataSnapshot.getValue(FoodItem.class);
            Log.d("h", "Gotdata" + foodItem.getImage());
           //Data can be taken from here, assigning to a global variable results null

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

我可以使用onDataChange()方法获取数据,但我无法找到在全局范围内捕获foodItem对象的方法。我需要返回foodItem对象。我该怎么做?

java android multithreading firebase firebase-realtime-database
2个回答
1
投票

定义一个接口:

interface FoodListener {

    void onFoodReceived(FoodItem foodItem);
    void onError(Throwable error);
}

然后修改你的方法:

public  void getFoodItem(String foodNum, final FoodListener listener) {

    dbReference=firebaseDatabase.getReference("Food"+foodNum);

    dbReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            FoodItem foodItem = dataSnapshot.getValue(FoodItem.class);
            Log.d("h", "Gotdata" + foodItem.getImage());

            listener.onFoodReceived(foodItem);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

            listener.onError(databaseError.toException());
        }
    });
}

现在,getFoodItem()方法的调用者可以传递一个监听器,该监听器将在检索食物或发生错误时被调用。


0
投票

对addValueEventListener的调用是异步的,因此您可以在onDataChange()方法中接收数据时更新UI。

如果要将其存储在全局变量中,只需在方法外声明它并在回调上更新:

private FoodItem foodItem;

public void getFoodItem(String foodNum){
    // ...
    dbReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            foodItem = dataSnapshot.getValue(FoodItem.class);
            // now update the UI
        }
        // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.