在我的widget服务类中,在onDataSetChanged()方法中,我调用来获取我的数据(异步)。但系统在加载数据之前调用getCount(),因此返回0表示大小,并且从不调用getViewAt()。
如果我在onDataSetChanged()中创建一些假数据而不是调用从Firebase获取真实数据,那么它将显示正常。所以我知道它与此不同。
我尝试过各种各样的事情让它发挥作用,但没有运气。我不想把它变成一个很长的问题,所以我会尽量保持简单。 我的问题是系统如何知道数据何时准备就绪?我似乎没有一种方法可以通知它现在数据已经存在。
我可能完全错了,但我认为这就是问题所在。 onDataSetChanged()方法不会等待,我无法告诉它。
让我更加困惑的是,在我使用假静态数据的应用程序的mockDebug版本中,即使使用异步调用,它也能正常工作。我的结论是它必须加载得如此之快,以至于在调用getCount()时它已经准备就绪。但更令人困惑的是,在很短的时间内它也在prodDebug版本中工作,然而从那以后就没有了。据我所知,那段时间我没有改变任何事情。无论如何,这是我能够提出的唯一解释。原因是因为我可以看到调试器或日志记录,当我从Firebase获取数据时,在加载数据之前调用getCount(),导致它失败,但是在加载数据后调用它,如果我使用静态数据,使其成功。
如何让它等待?或者还有其他一些我可能做错了吗?
感谢。
答案 0 :(得分:1)
好的,解决方案2:使用 CountDownLatch 将异步调用转换为同步调用。
有了这个,我可以从onDataSetChanged()内部获取所有数据,就像我最初尝试使用几行额外的代码一样。
到目前为止,我已经能够填充小部件列表并向其添加数据。
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html
答案 1 :(得分:0)
好的,所以我接受了我无法异步执行此操作并将ItemWidgetProvider.onUpdate()方法中的代码移动到新的IntentService。我用一个调用来替换代码,用appWidgetIds作为Intent extra来启动服务。
在这个新的IntentService中,我首先检索所有数据,然后调用之前从onUpdate()调用的代码。
我遇到过这个问题的一个问题,无论出于何种原因(如果你知道的话请评论),当我尝试将一个Serializable对象从IntentService传递给它刚刚赢得WidgetListService工作。我用String创建了一个Serializable测试,甚至不起作用。 Parcelable也是如此。 为了解决这个问题,我将其转换为byte []并将其发送给。这样可行。这是我遇到过这个问题的唯一一次,并且我使用Serializable将同一个对象保存到onSaveInstanceState,并且工作正常。不确定为什么只在小部件中出现问题。
修改:这不起作用。我可以在那里获取数据,但似乎并不是更新窗口小部件的方法,因此它只对静态窗口小部件有用。