1

我将从我想要完成的事情开始。

我有一个 ListFragment,与 LoaderCallbacks 关联以从数据库中检索数据。使用 AsyncTask 下载数据,并将其插入数据库。当用户到达列表底部时,使用 CWAC-Endless 小部件启动 AsyncTask 并下载更多数据。

我在这里遇到了几个问题,我已经尝试了很多个晚上来解决这个问题,我决定来这里寻求帮助。

第一个问题是configChanges。当用户旋转设备时,Activity 被销毁,然后重新创建所有 Fragment。我知道我可以将 setRetainInstance 设置为 true,但这无济于事,因为当 Activity 被拆除时 AsyncTask 仍在运行!

第二个问题与加载器有关。如果数据已下载,并且 AsyncTask 正常完成,则项目将正常显示在 List 中。假设数据库中有 20 个项目。当用户旋转设备,重新创建 Fragment 时,需要再次关联 Loader。发生这种情况时,数据不会立即加载到列表中,而是会启动用于下载的 AsyncTask,因为 CWAC-Endless 适配器认为它位于列表中的最后一项!

这两个问题都让我筋疲力尽。我需要重新审视这一点,因为我无处可去。

任何建议都可以,如果需要,我可以发布源代码。

编辑

好的,这里有更多细节可以帮助您提出一些建议。

我正在从互联网下载数据,它一次只会返回一定数量的项目。然后我必须在需要时请求更多数据(分页)。

我决定使用数据库,因为新的 Loader 功能使得确保数据加载有效且一致且没有任何线程问题变得如此简单。如果放弃 Loader 方法并使用标准适配器呈现数据是有意义的,我很乐意放弃这种方法并使用它。我只是想看看是否有人可以提供有关此解决方案为何如此困难的见解。

谢谢,

亚当

4

1 回答 1

1

当用户到达列表底部时,使用 CWAC-Endless 小部件启动 AsyncTask 并下载更多数据。

FWIW,我没有尝试EndlessAdapter过这种东西的组合(光标,加载器和AsyncTask)。特别是,引用文档:

请注意,这已经过ArrayAdapter广泛测试,但可能不适用于其他适配器类型

我什至不太确定EndlessAdapter应用于本地数据库的用例是什么。如果您有一个疯狂的长列表(例如,数千行),答案不是“逐步加载”而是“提供不同的用户体验以避免长列表”。对于较短的列表,只需加载整个内容并完成它。EndlessAdapter适用于负载昂贵的情况(例如,互联网访问)。

话虽如此,我将在我的待办事项列表中添加“玩EndlessAdapter和”。Loader

我知道我可以将 setRetainInstance 设置为 true,但这无济于事,因为当 Activity 被拆除时 AsyncTask 仍在运行!

所以?onPostExecute()在新活动通过之前不会被调用onCreate()。此外,在基于片段的模型中,您的任务应该与片段对话,如果该片段通过 保留setRetainInstance(true),那么它在旧活动和新活动中都是相同的片段实例。

发生这种情况时,数据不会立即加载到列表中

它应该被相当快地加载,尽管是异步的。此外,我不明白为什么这与最初创建活动时有什么不同。

而是启动了下载的 AsyncTask,因为 CWAC-Endless 适配器认为它位于列表中的最后一项

在拥有数据之前,您不应该创建。EndlessAdapter

于 2012-03-16T23:22:45.473 回答