【问题标题】:Is it safe to rely on the call to onDataSetChanged() after onCreated() in RemoteViewsFactory of an AppWidget在 AppWidget 的 RemoteViewsFactory 中的 onCreated() 之后依赖对 onDataSetChanged() 的调用是否安全
【发布时间】:2014-08-12 08:56:22
【问题描述】:

我根据 android 文档开发了我的 AppWidget,将光标加载到 onCreate() 并在 onDataSetChanged() 中重新加载,一切正常,直到我在 RemoteViewsService.RemoteViewsFactory 中设置了一些断点并惊讶地发现 @ 987654328@ 在调用onCreate() 之后总是被调用,这使得我的光标在第一次创建时加载了两次。我使用的是 Android 4.4.3。

根据Api doc

public abstract void onDataSetChanged()

在 API 级别 11 中添加

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

看来这个调用只有自己手动调用notifyDataSetChanged()才会触发。

不过根据Appwidget guide

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

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

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

你有什么想法吗?

【问题讨论】:

    标签: android android-appwidget remoteview


    【解决方案1】:

    正如您在链接指南中所见,onDataSetChanged 每次都在 onCreate 之后调用:

    (App Widgets | Android Developers)

    所以在 onDataSetChanged 中加载光标是安全的

    【讨论】:

    • 部分问题在于notifyAppWidgetViewDataChangedonDataSetChanged 之间的关系没有很好地描述。它们似乎引用了错误的方法名称或该方法的旧名称。解决方案的唯一提示是使用一个容易被忽视的链接:developer.android.com/reference/android/widget/…
    • @Auroratic:您似乎非常擅长小部件,我可以就一个问题征求您的意见吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多