我有一个项目通过适配器在Listview中显示RealmObjects。领域在每隔几分钟运行一次的SyncAdapter中更新。这会从服务器中提取数据,并更新领域,这有时会导致RealmObjects被删除。当这个后台SyncAdapter的同步周期完成时,它发送一个ListView的托管活动捕获的广播,这导致活动重新查询领域并使用更改的数据重新填充适配器。
问题是,当用户滚动ListView时,适配器正在从领域对象中获取字段以构建视图。如果同时运行同步,并且从域中删除对象(通过SyncAdapter),则在尝试从已删除对象构建视图时应用程序崩溃。
处理此案件的好方法是什么?我想在UI端添加一个领域观察者,并在触发时立即查询并重新设置适配器的RealmObject列表,但竞争条件仍然存在,它只是一个较短的窗口。
我还考虑过在UI线程的领域中将自动更新设置为false,并在检测到更改时实现一些逻辑来手动刷新UI线程域。
还有其他想法吗?
答案 0 :(得分:1)
common good practice是在图层数据模型和域模型上分离模型。在您的情况下,Activity
或Adapter
无需了解RealmObject
。 Realm
的所有回报都应转换为pojo
。
拥有不同的模型是正常的,它会为您提供线程安全的优势,如果有需要,更容易更改数据库。
数据层模型
public class RealmEvent extends RealmObject {
@PrimaryKey
private int eventId;
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getEventId() {
return eventId;
}
public void setEventId(int eventId) {
this.eventId = eventId;
}
}
域名模型
public class Event {
private int eventId;
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getEventId() {
return eventId;
}
public void setEventId(int eventId) {
this.eventId = eventId;
}
}
<强>映射强>
public class EventMapper {
public Event map(RealmEvent event) {
...
}
}
也许这个解决方案对性能有一点影响。但是直到2015年12月,它才是唯一的解决方案,如果您想与RxJava
合作,那么我认为差异不会很大。