Android 从onCreateView中的firebase检索数据返回null

Android 从onCreateView中的firebase检索数据返回null,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,成功检索onDataChange方法中的数据。但是,无法在onDataChange方法(onCreateView内部)之外检索数据。当试图从trackList获取数据时,它返回null 下面是我如何从firebase检索数据并尝试在视图上显示 currentUser = (User) getArguments().getSerializable("currentUserBundle"); databaseTracks = FirebaseDatabase.getInstance().g

成功检索onDataChange方法中的数据。但是,无法在onDataChange方法(onCreateView内部)之外检索数据。当试图从trackList获取数据时,它返回null

下面是我如何从firebase检索数据并尝试在视图上显示

currentUser = (User) getArguments().getSerializable("currentUserBundle");

    databaseTracks = FirebaseDatabase.getInstance().getReference("tracks").child(currentUser.getUserId());
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yy");
    Date date = new Date();
    todayDate = simpleDateFormat.format(date);

    databaseTracks.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Iterable<DataSnapshot> children = dataSnapshot.getChildren();

            if (trackList != null) {
                trackList.clear();
            }

            for (DataSnapshot c : children) {
                trackList.add(c.getValue(UserFoodRecord.class));
            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    if (trackList != null) {
        for (UserFoodRecord u : trackList) {
            //Problem at here !!!!!!
            //return null while try to retrieve data
            dateList.add(u.getDate());
            if (u.getDate() == todayDate) {
                checkTodayRecord = true; //got today record
                UserFoodRecord tempRecord = new UserFoodRecord(u.getDate(), u.getBreakfast(), u.getLunch(), u.getDinner(), u.getOther()
                        , u.getExercise(), u.getGoal(), u.getFood(), u.getExerciseBurn());
                currentUserFoodRecord = tempRecord;
            }
        }
    }

    //return null
    if (currentUserFoodRecord != null) {
        caloriesGoal.setText(currentUserFoodRecord.getGoal().toString());
        caloriesFood.setText(currentUserFoodRecord.getFood().toString());
        caloriesExerc.setText(currentUserFoodRecord.getExerciseBurn().toString());
        caloriesRemain.setText(currentUserFoodRecord.getRemaining().toString());
    }
currentUser=(用户)getArguments().getSerializable(“currentUserBundle”);
databaseTracks=FirebaseDatabase.getInstance().getReference(“tracks”).child(currentUser.getUserId());
SimpleDateFormat SimpleDateFormat=新SimpleDateFormat(“年月日”);
日期=新日期();
todayDate=simpleDateFormat.format(日期);
databaseTracks.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
Iterable children=dataSnapshot.getChildren();
if(trackList!=null){
trackList.clear();
}
用于(数据快照c:儿童){
add(c.getValue(UserFoodRecord.class));
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
if(trackList!=null){
对于(UserFoodRecord u:trackList){
//这里有问题!!!!!!
//尝试检索数据时返回null
添加(u.getDate());
如果(u.getDate()==todayDate){
checkTodayRecord=true;//获得今天的记录
UserFoodRecord tempRecord=新的UserFoodRecord(u.getDate()、u.GetBreaken()、u.Get午餐()、u.GetDimension()、u.getOther())
,u.getExercise(),u.getGoal(),u.getFood(),u.getExerciseBurn());
currentUserFoodRecord=tempRecord;
}
}
}
//返回空值
如果(currentUserFoodRecord!=null){
卡路里目标.setText(currentUserFoodRecord.getGoal().toString());
卡路里食品.setText(currentUserFoodRecord.getFood().toString());
caloriesExerc.setText(currentUserFoodRecord.getExerciseBurn().toString());
caloriesRemain.setText(currentUserFoodRecord.GetLeving().toString());
}
来自firebase的数据


在Firebase异步获取数据时,将代码移到
onDataChange

databaseTracks.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Iterable<DataSnapshot> children = dataSnapshot.getChildren();

            if (trackList != null) {
                trackList.clear();
            }

            for (DataSnapshot c : children) {
                trackList.add(c.getValue(UserFoodRecord.class));
            }

            if (trackList != null) {
                for (UserFoodRecord u : trackList) {
                    dateList.add(u.getDate());
                    if (u.getDate() == todayDate) {
                        checkTodayRecord = true; //got today record
                        UserFoodRecord tempRecord = new UserFoodRecord(u.getDate(), u.getBreakfast(), u.getLunch(), u.getDinner(), u.getOther()
                                , u.getExercise(), u.getGoal(), u.getFood(), u.getExerciseBurn());
                        currentUserFoodRecord = tempRecord;
                    }
                }
            }


            if (currentUserFoodRecord != null) {
                caloriesGoal.setText(currentUserFoodRecord.getGoal().toString());
                caloriesFood.setText(currentUserFoodRecord.getFood().toString());
                caloriesExerc.setText(currentUserFoodRecord.getExerciseBurn().toString());
                caloriesRemain.setText(currentUserFoodRecord.getRemaining().toString());
            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
databaseTracks.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
Iterable children=dataSnapshot.getChildren();
if(trackList!=null){
trackList.clear();
}
用于(数据快照c:儿童){
add(c.getValue(UserFoodRecord.class));
}
if(trackList!=null){
对于(UserFoodRecord u:trackList){
添加(u.getDate());
如果(u.getDate()==todayDate){
checkTodayRecord=true;//获得今天的记录
UserFoodRecord tempRecord=新的UserFoodRecord(u.getDate()、u.GetBreaken()、u.Get午餐()、u.GetDimension()、u.getOther())
,u.getExercise(),u.getGoal(),u.getFood(),u.getExerciseBurn());
currentUserFoodRecord=tempRecord;
}
}
}
如果(currentUserFoodRecord!=null){
卡路里目标.setText(currentUserFoodRecord.getGoal().toString());
卡路里食品.setText(currentUserFoodRecord.getFood().toString());
caloriesExerc.setText(currentUserFoodRecord.getExerciseBurn().toString());
caloriesRemain.setText(currentUserFoodRecord.GetLeving().toString());
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});

我以前尝试过这个方法,但是当我尝试显示tempRecord数据时,它在onDataChanged()之外再次变为null,因为在调用
onDataChange
之前执行了
display tempRecord
代码,因为Firebase异步获取数据
在我尝试显示数据时仍然存在问题。07-20 18:59:43.072 15830-15830/com.example.cheejin.fyp E/AndroidRuntime:致命异常:主进程:com.example.cheejin.fyp,PID:15830 java.lang.nullpointer异常:尝试调用虚拟方法“java.lang.Double com.example.cheejin.fyp.UserFoodRecord.getGoal()'在com.example.cheejin.fyp.AddFragment$2.onClick(AddFragment.java:164)的一个空对象引用上,您将在其中获得NullPointerException
UserFoodRecord.getGoal()必须为NULL
现在,只要在onDataChanged()方法中执行所有方法,我就可以获取数据。谢谢你的帮助。我建议你从这里看到我的anwser的最后一部分,也看看这个,以便更好地理解你为什么会有这种行为。