Java 如何从Android中的firebase返回值?

Java 如何从Android中的firebase返回值?,java,android,multithreading,firebase,firebase-realtime-database,Java,Android,Multithreading,Firebase,Firebase Realtime Database,我可以使用onDataChange()方法获取数据,但我无法找到在全局范围内捕获foodItem对象的方法。我需要返回foodItem对象。如何操作?对addValueEventListener的调用是异步的,因此当在onDataChange()方法中收到数据时,您可以更新UI 如果要将其存储在全局变量中,只需在方法外部声明它并在回调中更新: public void getFoodItem( String foodNum) { dbReference=firebaseDatabase

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

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

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

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) {

        }
    });
}

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

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

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) {

        }
    });
}
定义一个接口:

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
        }
        // ...
}
然后修改您的方法:

interface FoodListener {

    void onFoodReceived(FoodItem foodItem);
    void onError(Throwable error);
}
现在,
getFoodItem()
方法的调用方可以传递一个侦听器,该侦听器将在检索食物或发生错误时被调用。

定义一个接口:

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
        }
        // ...
}
然后修改您的方法:

interface FoodListener {

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

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

获取一个空对象引用。java.lang.NullPointerException:尝试调用虚拟method@Waesz每次数据更改时都会调用您的侦听器,这是您想要的吗?如果只想查询一次,则有一个
addListenerForSingleValueEvent()
方法。获取空对象引用。java.lang.NullPointerException:尝试调用虚拟method@Waesz每次数据更改时都会调用您的侦听器,这是您想要的吗?如果只想查询一次,则有一个
addListenerForSingleValueEvent()
方法。添加回调是什么意思?你能举个例子吗?添加回调是什么意思?你能举个例子吗?