【问题标题】:How can I return a value from firebase in Android? [duplicate]如何从 Android 中的 firebase 返回值? [复制]
【发布时间】:2018-07-08 03:44:26
【问题描述】:
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


    【解决方案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() 方法的调用者可以传递一个侦听器,该侦听器将在检索食物或发生错误时被调用。

    【讨论】:

    • 获取一个空对象引用。 java.lang.NullPointerException: 尝试调用虚方法
    • @Waesz 每次数据更改时都会调用您的侦听器,这是您的意图吗?如果只想查询一次,可以使用addListenerForSingleValueEvent() 方法。
    【解决方案2】:

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

    【讨论】:

    • 添加回调是什么意思?能举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2020-12-03
    • 1970-01-01
    • 2019-10-14
    • 2022-08-16
    • 2021-04-04
    相关资源
    最近更新 更多