好吧,看来我又被卡住了。我的窗口小部件可以正常工作,我想我知道为什么它会失败,但是我不知道如何解决。

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

如果我在onDataSetChanged()内创建一些虚假数据,而不是调用从Firebase获取真实数据,那么它将显示得很好。因此,我知道它的工作原理与此不同。

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

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

更令人困惑的是,在我的应用程序的模拟调试版本中,即使使用异步调用,我也会使用伪造的静态数据来实际工作。我的结论是,它必须加载得如此之快,以至于在调用getCount()时就已经准备好了。但是,更令人困惑的是,有一小段时间它还在prodDebug版本中工作,此后一直没有,而且从此以后也从未如此。据我所知,那段时间我什么都没改变。无论如何,这是我唯一能提出的解释。原因是因为从Firebase获取数据时,我可以在调试器中看到日志,也可以记录日志在数据加载之前调用getCount(),从而导致失败,但是如果我使用静态数据,则在加载数据后调用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/

10-10 09:29
查看更多