【发布时间】:2017-12-09 05:39:10
【问题描述】:
我正在尝试根据从 Firebase 检索到的数据执行一些任务。
for (inti=0;i<dateList.size();i++)
{
attendanceDateRef= attendanceRef.child(dateList.get(i));
attendanceClassRef= attendanceDateRef.child(ViewAttendanceSelectClassActivity.selectedClass);
attendanceClassRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshotdataSnapshot) {
for (DataSnapshotdsp : dataSnapshot.getChildren())
{
attendanceList.add(dsp.getValue(String.class));
Log.e("attendanceListValues",dsp.getValue(String.class));
}
}
@Override
public void onCancelled(DatabaseErrordatabaseError) {
}
});
}
intindex=1;
for (inti=1;i<=attendanceList.size();i++)
{
if(i%4==0)
{
fullDateRangeList.add(dateList.get(index));
index++;
}
else
{
fullDateRangeList.add(dateList.get(index));
}
}
Log.e("fullDateRangeList",String.valueOf(fullDateRangeList.size()));
Log.e("attendanceList",String.valueOf(attendanceList.size()));
上面的代码是在Button 的OnClick 事件上编写的,当我点击Button 时,logcat 上会生成以下输出:
fullDateRangeList:0
attendanceList:0
attendanceListValues:Value1
attendanceListValues:Value2
attendanceListValues:Value3
attendanceListValues:Value4
.
.
.
attendanceListValues:ValueN
从上面的输出看来,第二个循环在从 Firebase 检索数据之前正在执行,这就是 fullDateRange 和出席列表的大小为 0 的原因。
有什么方法可以阻止第二个循环执行,直到数据存储在出席列表中?
【问题讨论】:
-
将可执行代码放入监听器中,在监听器调用后执行
-
以上代码写在按钮的OnClickListener上
-
addValueEventListener 是异步的。它不会阻塞,你不应该试图让它阻塞。您必须响应回调中的数据。这将需要对您的代码进行重大重组。
-
onDataChange是其他听众 -
一个非常简单的解决方案,添加所有将使用
ondatachange中检索到的数据的所有内容,并在 else 之后添加一个return,然后您的问题就解决了