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



好吧,看来我又被卡住了。我的小部件工作了一半,我想我知道它为什么失败,但我不知道如何修复它。

在我的小部件服务类中,在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

异步方法的同步版本

好的,所以我接受了我不能异步执行此操作的事实,并将 ItemWidgetProvider.onUpdate() 方法中的代码移动到新的 IntentService。我用调用替换了代码,以使用 appWidgetIds 作为额外的 Intent 启动服务。

在这个新的IntentService中,我首先检索所有数据,然后调用以前从onUpdate()调用的代码。


我在这个解决方案中遇到了一个问题,那就是无论出于何种原因(如果您知道,请发表评论),当我尝试将可序列化对象从 IntentService 传递到 WidgetListService 时,它将无法正常工作。我创建了一个仅使用字符串的可序列化测试,即使这样也不起作用。包裹也是如此。为了解决这个问题,我转换为一个字节[]并发送它。这行得通。这是我唯一一次遇到此问题,我使用可序列化将同一对象保存到 onSaveInstanceState 并且它工作正常。不知道为什么仅在小部件中它有问题。

编辑:这不起作用。我可以在那里获取数据,但似乎没有办法更新小部件,所以它只对静态小部件有好处。

最新更新