在AppWidget的RemoteViewsFactory中onCreated()之后依赖对onDataSetChanged()的调用是否安全?

时间:2014-08-12 08:56:22

标签: android android-appwidget remoteview

我根据android文档开发了我的AppWidget,将光标加载到onCreate()并在onDataSetChanged()中重新加载,一切正常,直到我在{{{{ 3}}并且令人惊讶地发现onDataSetChanged()在调用onCreate()后始终 ,这使得我的游标在首次创建时加载了两次。我在Android 4.4.3上。

根据RemoteViewsService.RemoteViewsFactory

  

public abstract void onDataSetChanged()

     

在API级别11中添加

     

在远程适配器上触发notifyDataSetChanged()时调用。这允许RemoteViewsFactory通过更新任何内部引用来响应数据更改。注意:在此方法中可以安全地同步执行昂贵的任务。在此期间,旧数据将显示在小部件中。

似乎只能通过手动调用notifyDataSetChanged()来触发此调用。

然而根据Api doc

  

在onCreate()中,您可以为数据源设置任何连接/光标。举重,   例如下载或创建内容等,应该推迟到onDataSetChanged()   或getViewAt()。在此调用中花费超过20秒将导致ANR。

通过说延迟,是否暗示onDataSetChanged()之后会调用onCreate()?我不太确定......但它确实说我应该将光标设置在onCreate()内。

我自己尝试调查此问题,但可用的源代码使用Binder,因此远程调用者仍然未知,因此我无法检查其来源。

你有什么想法吗?

1 个答案:

答案 0 :(得分:5)

正如您在链接指南中看到的那样,每次在onCreate之后调用onDataSetChanged:

Data flow

App Widgets | Android Developers

将光标加载到onDataSetChanged

是安全的