如何等到从 Firebase 检索到我的数据? [复制]

Posted

技术标签:

【中文标题】如何等到从 Firebase 检索到我的数据? [复制]【英文标题】:How do I wait until my data is retrieved from Firebase? [duplicate] 【发布时间】:2019-09-11 02:38:14 【问题描述】:

我的问题是,在结束我的主要方法之前,我需要等待通过方法“onDataChange”检索来自 Firebase 的数据。

我的代码是(CalendarDbHelper):

public synchronized ArrayList<Day> listDays()
    
       final  CountDownLatch done = new CountDownLatch(1);
        db.addValueEventListener(new ValueEventListener() 

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) 
                if(dataSnapshot.exists())
                
                    for(DataSnapshot postSnapShot:dataSnapshot.getChildren())
                    
                        Day day=postSnapShot.getValue(Day.class);
                        listDays.add(day);

                    
                
               done.countDown();
            


            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) 

            

        );

        try 
            done.await(); 
         catch(InterruptedException e) 
            e.printStackTrace();
        
        return listDays;

    

如您所见,我已经在尝试使用 CountDownLatch 等待,但它不起作用:卡住了。

我需要活动“CalendarActivity”的listDays,我像这样使用它:

 //Real initialization of the database
        db = FirebaseDatabase.getInstance().getReference();
        mDatabase = new CalendarDbHelper(db);
        final List<Day> allDays = mDatabase.listDays();



        //Activating things to click on
        if(allDays.size() > 0)
            calendarRV.setVisibility(View.VISIBLE);
            calendarRVAdapter = new CalendarAdapter(this, allDays, new CalendarAdapter.OnListItemClickListener() 

                @Override
                public void onListItemClick(int clickedItemIndex) 
                    String id = allDays.get(clickedItemIndex).getId();
                    MyCustomAlertDialog(id);
                
            );
            calendarRV.setAdapter(calendarRVAdapter);
        else 
            calendarRV.setVisibility(View.GONE);
            Toast.makeText(this, "There is no product in the database. Start adding now", Toast.LENGTH_LONG).show();
        

【问题讨论】:

你试过Handler了吗?后延迟方法?? 你的 Handler 是什么意思?而且我也从未听说过后延迟方法:c 您希望在一段时间后调用方法 db.addValueEventListener() 对吗?? 不是真的,确实我想等待 onDataChange() 方法完成检索数据,然后返回 listDays,因为如果不等待,返回的 listDays 为 null 现在我遇到了你的问题。听着,数据是从 Firebase 异步加载的。你需要了解那件事。 【参考方案1】:

如果这是你的“主要方法”,你应该在onDataChange被触发时放置返回数据

【讨论】:

我真的不明白我应该怎么做。你想让我在 onDataChange 里面放一个“return listDays”吗? @Nouxy 是你的“主要方法”调用这个函数来获取数据??? 如果是,则从main调用此方法但不返回数据。保持视图显示进度。在onDatachange中,在返回数据时执行更新UI的功能。如果你只想做 1 次,清除 datachange 监听器 对不起,“主要方法”是什么意思?我真的不明白你要我做什么 私有 OnGetDataDone onDone; CalendarDbHelper(db,OnGetDataDone onDone) this.onDone = onDone; public interface OnGetDataDone void onDone(ListDay listday) 将此添加到您的 CalendarDbHelper 并将所有更新 ui 的代码放在您的 CalendarActivity 中的 onDone 方法覆盖中【参考方案2】:

试试这个。

 public synchronized ArrayList<Day> listDays()
    
   final  CountDownLatch done = new CountDownLatch(1);
    db.addValueEventListener(new ValueEventListener() 

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 

            if(dataSnapshot.exists())
            
                for(DataSnapshot postSnapShot:dataSnapshot.getChildren())
                
                    Day day=postSnapShot.getValue(Day.class);
                    listDays.add(day);

                

             // Do whatever you want to do with your list from here..

            
           done.countDown();
        


        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) 

        

    );

    try 
        done.await(); 
     catch(InterruptedException e) 
        e.printStackTrace();
    
    return listDays;


【讨论】:

它不起作用,因为在 "listDays.add(day);" 行上无法识别在 "for" 循环中创建的 Day这是在“for”循环之外:/ 所以最终的解决方案是更新的答案。几天前,我也陷入了这种情况。我试过这种方式来工作。一切都很完美。 我可以看看你的完整代码吗?您在代码中的哪个位置使用该 listDays?? 我刚刚上传了我在代码中使用 listDays 的编辑 :)

以上是关于如何等到从 Firebase 检索到我的数据? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 Firebase 检索到我的适配器

如何从Firebase检索数据到我的适配器

如何从从 Firebase 检索信息的闭包中传递数据?

我正在尝试将 firebase 实时数据库中的数据检索到我的 recyclerview 中,但数据显示为空

我如何从firebase检索数据到android listview顶部[重复]

从firebase数据库中检索计算平均值