我将从我想要完成的事情开始。
我有一个ListFragment,其中LoaderCallbacks与从DB中检索数据相关联。使用AsyncTask下载数据,并将其插入数据库。当用户到达列表的底部时,使用CWAC-Endless小部件启动AsyncTask并下载更多数据。
我在这里遇到了几个问题,我试图在一个晚上解决这个问题,我决定来这里寻求帮助。
第一个问题是configChanges。当用户旋转设备时,活动将被销毁,然后重新创建所有碎片。我知道我可以使用setRetainInstance为true,但是当Activity被拆除时,AsyncTask仍然在运行,这没有用!
第二个问题是与Loader有关。如果下载了数据,并且AsyncTask完成正常,那么这些项目将在List中显示。可以说数据库中有20个项目。当用户旋转设备并重新创建Fragment时,需要再次关联Loader。发生这种情况时,数据不会立即加载到列表中,而是启动下载的AsyncTask,因为CWAC-Endless适配器认为它位于列表中的最后一项!
这两个问题都让我筋疲力尽。我需要对此进行全新审视,因为我无处可去。
任何建议都可以,如果需要,我可以发布源代码。
修改
好的,这里有一些细节可以帮助我们提供一些建议。
我从互联网上下载数据,一次只返回一定数量的项目。然后,当我需要时,我必须请求更多数据(分页)。
我决定使用一个数据库,因为新的Loader功能使得它非常简单,可以确保数据加载有效且一致,没有任何线程问题。 如果放弃Loader方法并使用标准适配器来呈现数据是有意义的,我非常乐意放弃这种方法并使用它。我只想看看是否有人能够深入了解为什么这个解决方案如此困难。
谢谢,
亚当
答案 0 :(得分:1)
当用户到达列表底部时,使用CWAC-Endless小部件启动AsyncTask并下载更多数据。
FWIW,我没有尝试使用这些组合(游标,加载器和EndlessAdapter
)AsyncTask
。特别是引用文档:
请注意,这已经过
ArrayAdapter
广泛测试,但可能无法与其他适配器类型一起使用
我甚至不确定应用于本地数据库的EndlessAdapter
的用例是什么。如果你有一个疯狂的长列表(例如,数千行),答案不是“逐步加载”,而是“提供不同的用户体验以避免长列表”。对于较短的列表,只需加载整个事物并完成它。 EndlessAdapter
用于加载费用昂贵的情况(例如,互联网访问)。
话虽如此,我会在我的待办事项列表中添加“与EndlessAdapter
和Loader
一起玩”。
我知道我可以将setRetainInstance用于true,但是当Activity被拆除时AsyncTask仍然在运行时这没有帮助!
所以?在新活动通过onPostExecute()
之前,不会调用onCreate()
。此外,在基于片段的模型中,您的任务应该与片段进行对话,如果该片段通过setRetainInstance(true)
保留,则它在旧活动和新活动中都是相同的片段实例。
发生这种情况时,数据不会立即加载到列表中
它应该以相当快的速度加载,尽管是异步的。此外,我不明白为什么这与首次创建活动时有什么不同。
而且下载的AsyncTask启动,因为CWAC-Endless适配器认为它在列表的最后一项
在您拥有数据之前,您不应该创建 EndlessAdapter
。