android - 小部件服务在尝试填充集合之前不会等待数据

标签 android firebase-realtime-database android-widget

看来我又被卡住了。我的小部件工作了一半,我我知道它失败的原因,但我不知道如何修复它。

在我的小部件服务类中,在 onDataSetChanged() 方法中,我调用以获取我的数据(异步)。但是系统在加载数据之前调用了 getCount(),因此返回 0 作为大小,并且从不调用 getViewAt()。

如果我在 onDataSetChanged() 中创建一些假数据,而不是调用从 Firebase 获取真实数据,那么它将正常显示。所以我知道它与此不同。

我尝试了各种方法来让它工作,但没有成功。我不想把它变成一个很长的问题,所以我会尽量保持简单。 我的问题是系统如何知道数据何时准备就绪?似乎没有我可以调用的方法来通知它数据现在已经存在。

我可能完全错了,但我认为这就是问题所在。 onDataSetChanged() 方法不会等待,我无法告诉它等待。

更令人困惑的是,在我使用假静态数据的应用程序的 mockDebug 版本中,它实际上可以工作,即使是异步调用也是如此。我的结论是它必须加载得如此之快,以至于在调用 getCount() 时它已经准备就绪。但更令人困惑的是,有一段时间它也在 prodDebug 版本中工作,然后就没有了,从那以后也没有。据我所知,那段时间我没有改变任何东西。无论如何,这是我能想到的唯一解释。原因是因为我可以通过调试器或日志记录看到当我从 Firebase 获取数据时在加载数据之前调用了 getCount() ,导致它失败,但是如果我使用静态数据则在加载数据之后调用它, 让它成功。

如何让它等待?还是我可能做错了什么?

谢谢。

最佳答案

好的,解决方案 2:使用 CountDownLatch 将异步调用转换为同步调用。

有了这个,我可以从 onDataSetChanged() 内部获取所有数据,就像我最初尝试的那样,只需要几行额外的代码。

到目前为止,我已经能够填充小部件列表并向其添加数据。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html

Sync version of async method

关于android - 小部件服务在尝试填充集合之前不会等待数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43225828/

相关文章:

java - 如何在 Android Studio 上安装 Android Marshmallow?

android - 我可以在 Activity 暂停时更新 View 吗?

java - 如何从 Firebase 数据库中检索唯一 ID?

android - android小部件是否在与其应用程序相同的进程中运行

android - 何时在 DialogFragment 中使用 DatePickerDialog 而不是 DatePicker?

android - onUpdate() intilized 变量在小部件类的 onReceive 中为空

android - 如何以编程方式重启android应用程序

java - 从 url 读取响应

java - Firebase RecyclerView 适配器无法获得准确的 View 位置

swift - 使用 Swift 在 Firebase 中通过给定的电子邮件获取用户的 uid