【发布时间】:2016-01-11 17:57:00
【问题描述】:
我有一个通过适配器在 Listview 中显示 RealmObjects 的项目。领域在每隔几分钟运行的 SyncAdapter 中更新。这会从服务器中提取数据并更新领域,这有时会导致领域对象被删除。当这个后台 SyncAdapter 的同步周期完成时,它会发送一个广播,ListView 的托管活动捕获该广播,这会导致活动重新查询领域并使用更改的数据重新填充适配器。
问题是,当用户滚动 ListView 时,适配器正在从领域对象中获取字段以构建视图。如果同步在此时运行,并且从领域中删除了一个对象(通过 SyncAdapter),则应用程序在尝试从已删除的对象构建视图时崩溃。
处理这种情况的好模式是什么?我想在 UI 端添加一个领域观察者,并在触发时立即查询并重新设置适配器的 RealmObject 列表,但是竞争条件仍然存在,它只是一个更短的窗口。
我还考虑过在 UI 线程领域将 auto-updates 设置为 false,并实现一些逻辑以在检测到更改时手动刷新 UI 线程领域。
还有其他想法吗?
【问题讨论】:
-
如果您的同步适配器在后台线程上运行。在 RealmResults 上注册一个 ChangeListener 并在触发时刷新 ListAdapter 就足够了。由于删除对象而导致崩溃的唯一情况是,如果您将对它们的引用保持在刷新范围之外。
标签: android multithreading android-listview realm