在firebase addListenerForSingleValueEvent上处理异步

时间:2017-09-17 00:14:37

标签: android firebase firebase-realtime-database

因此,我尝试使用基于我的firebase数据库上的某些信息的颜色初始化每个日历单元格,并且为此我使用设置为false的标志,然后如果条件满足则变为true。问题是addListenerForSingleValueEvent是一个异步方法,因此该标志一直返回false。我应该怎么处理?

mCalendar.addDecorator(new DayViewDecorator() {
                @Override
                public boolean shouldDecorate(final CalendarDay day) {
                    final boolean[] flag = {false};
                    final String currentDate = day.getCalendar().get(Calendar.YEAR)
                            + "" + day.getCalendar().get(Calendar.MONTH)
                            + "" + day.getCalendar().get(Calendar.DAY_OF_MONTH);

                    database.child(currentDate).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot snapshot) {
                            if (snapshot.exists()) {
                                flag[0] = true;
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                    return flag[0];
                }

                @Override
                public void decorate(DayViewFacade view) {
                    view.addSpan(new ForegroundColorSpan(
                            ContextCompat.getColor(getApplicationContext(), R.color.material_red_a200)));
                }
            });

1 个答案:

答案 0 :(得分:1)

要解决此问题,请在boolean[] flag方法中移动onDataChange()数组的声明,否则它将始终为null。

public void onDataChange(DataSnapshot snapshot) {
    final boolean[] flag = {false};
    if (snapshot.exists()) {
        flag[0] = true;
    }
    Log.d("TAG", flag[0]);
}

这是由于onDataChange()方法的异步行为而发生的,即使您尝试从该数组中获取值,也会调用此方法。 在方法中移动声明并在那里使用它,解决了你的问题。

如果您想在该方法之外使用该数组的值,请查看我在这篇文章中的回答How To Get Async Value Outside onDataChange() Method