【问题标题】:How to stop execution of piece of code in android until data is retrieved from Firebase?如何在从 Firebase 检索数据之前停止在 android 中执行一段代码?
【发布时间】: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()));

上面的代码是在ButtonOnClick 事件上编写的,当我点击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,然后您的问题就解决了

标签: android firebase


【解决方案1】:

您不能停止该方法或让它等到您从数据库中获取所有数据。这是异步方法的行为。您需要通过仅在 onDataChange() 方法内声明和使用该数据来稍微更改代码的逻辑,否则它将始终为空。

还有另一种方法。如果您愿意,您可以深入了解异步世界并使用我在 post 中的回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2020-09-11
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多