【问题标题】:Where to call IntentService to populate data into SQLite for RecyclerView Adapters in Android在哪里调用 IntentService 将数据填充到 SQLite for RecyclerView Adapters in Android
【发布时间】:2016-02-17 07:01:27
【问题描述】:

我有一个 Activity,它有一个全屏片段 RecyclerView。该片段实现LoaderManager.LoaderCallbacks<Cursor>

我有一个 IntentService 从 API 获取数据,删除本地 SQLite 数据库中的所有现有数据,然后通过内容提供程序存储所有新数据。

加载器然后将放入 SQLite 的任何数据加载到RecyclerView

我的问题是: 在哪里放置我的代码以触发 IntentService 的最有效位置

只是想知道如果放在不合适的地方会不会产生任何冲突。

目前,我将它作为活动中OnCreate() 的最后几行:

// Fire off service to get data
Intent i = new Intent(this, MyService.class);
startService(i);

我正在考虑把它放在其他地方:

  • 在片段中的OnCreate()
  • 在片段中的OnActivityCreated()

【问题讨论】:

    标签: android sqlite android-fragments


    【解决方案1】:

    在我看来,在您的活动的onCreate 中运行它就可以了,但是在这种情况下,您的RecyclerView 可能会向用户显示过时的内容。所以你应该以某种方式从IntentService 内部通知你的RecyclerView 并让它重新查询数据库。

    在该片段的onCreateOnActivityCreated() 中运行该服务不会给您带来任何性能提升。

    为了给您的用户带来更好的用户体验,我建议您使用下拉更新库来启动该服务,并在用户将其向下拖动时更新列表。就像 Instagram 应用一样。

    【讨论】:

    • 酷。我按照我的方式进行设置的原因是,就像 Instagram 应用程序一样,如果你打开应用程序并且没有网络,你仍然会看到上次打开应用程序的结果(尽管你会得到一个吐司通知说“无法刷新结果”)。因此,在这种情况下,将那些过时的内容呈现给用户是可以的。至少比看一个空白屏幕要好。你完全读懂了我的想法,在这个设置中使用 pull-to-update =) 我的确切意图。
    【解决方案2】:

    首先,我想让你看看 SO 中的this answer,它也有指向 android 文档的链接。

    同样从文档中可以看出,IntentService 有一些限制:

    IntentService 有一些限制:

    它不能直接与您的用户界面交互。要将其结果放入 UI,您必须将它们发送到 Activity。

    工作请求按顺序运行。如果一个操作正在 IntentService 中运行,并且您向它发送另一个请求,则该请求将一直等待,直到第一个操作完成。

    在 IntentService 上运行的操作不能被中断。

    但是,在大多数情况下,IntentService 是执行简单后台操作的首选方式。

    【讨论】:

    • 我没有问你是否应该使用 IntentService... =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多