这个问题在这里已有答案:
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对象。我该怎么做?
定义一个接口:
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()
方法的调用者可以传递一个监听器,该监听器将在检索食物或发生错误时被调用。
对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
}
// ...
}