看来我又被卡住了。我的小部件工作了一半,我想我知道它失败的原因,但我不知道如何修复它。
在我的小部件服务类中,在 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
关于android - 小部件服务在尝试填充集合之前不会等待数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43225828/