我有一个活动,它实现了所有这些代码所在的片段。这最好通过一个例子来解释,因为代码是保密的。此示例反映了正在尝试完成的操作和我在测试中观察到的操作
例如)我有一个rss阅读器片段,它从两个具有Loaders的唯一Loader (Loader1,Loader2)中获取两个唯一的对象(A,B)。
Object A:
int[] fullArticleIdList;
List<ArticlePreview> partialArcticlePreviewList;
Object B:
List<ArticlePreview> partialArcticlePreviewList;在创建时,我在Loader1上调用"initloader“,它获取对象A。在滚动可用文章后,它到达从对象A返回的partialArcticlePreviewList的底部,并使用"restartloader on Loader2”获取更多文章,它获取对象B,并允许用户读取它们,并继续对所有文章执行此操作。
在用户旋转设备从而调用onCreate之前,这种方法工作得很好。现在,当在Loader1上调用initloader时,它在连接到Loader1之后立即跳转到onLoadFinished并返回Loader1。虽然正确地返回了articleIds,但返回的partialArcticlePreviewList是从Loader2获取对象B的are。
加载器管理器是否只在缓存中保留对象的一个实例,并在多个加载器之间共享它?从广泛的测试(5+小时试图找到问题并查看Eclipse调试器中的加载器ID/缓存/地址)可以看出,它使用在加载器2的partialArcticlePreviewList中接收到的数据覆盖了加载器1的partialArcticlePreviewList。虽然这种情况对于单个Loader来说是理想的,但我认为每个Loader的缓存应该是分开的。显然,加载器的优势之一是它们通过屏幕旋转和数据缓存的易用性和持久性,但它似乎并不像所暗示的那样工作。我们通过保留片段的一个实例并用onCreateView和onDestroyView编写适当的代码来避免内存泄漏,从而绕过了这个问题,但是这是一个好的解决方案吗?
编辑:忘记添加,我们使用的是兼容性库v4。此外,查看装载器的安卓源代码似乎并没有说明为什么装载器返回了错误的数据"mId“。
发布于 2012-08-11 02:34:22
用于规避此问题的最终解决方案是自己管理数据,而不是依赖加载器。
当加载器只为屏幕加载一件东西时,它们可以很好地保留数据,但是对于分页,它们制造了所有这些麻烦,它们的操作方式仍然没有得到很好的理解;结论是它们没有像预期的那样操作,或者我们的实现有缺陷,这只会在更高级的用例中变得明显。
为了管理我们自己的数据,我们使用了捆绑包/保留片段的组合,同时小心地在onDestroyView中正确地清理了一切。我们还让加载器在轮换后执行回调时检查我们的数据集是否已经有数据,这样我们就不会向数据集中添加两次分页数据。另一种选择是使用单例对象。
希望这对将来的其他人有所帮助。
https://stackoverflow.com/questions/11787031
复制相似问题