后台同步删除的列表视图中的领域对象导致崩溃
realm objects in a listview deleted by background sync causes crash
我有一个通过适配器在列表视图中显示 RealmObjects 的项目。领域在每隔几分钟运行一次的 SyncAdapter 中更新。这从服务器中提取数据,并更新领域,这有时会导致 RealmObjects 被删除。当此后台 SyncAdapter 的同步周期完成时,它会发送一个广播,ListView 的托管 activity 会捕获该广播,这会导致 activity 重新查询领域并使用更改后的数据重新填充适配器。
问题是,当用户滚动 ListView 时,适配器正在从领域对象中获取字段以构建视图。如果同步在此时运行,并且从领域中删除了一个对象(通过 SyncAdapter),则应用程序在尝试从已删除的对象构建视图时会崩溃。
处理这种情况的好的模式是什么?我想在 UI 端添加一个领域观察者,并在触发时立即查询并重新设置适配器的 RealmObject 列表,但是竞争条件仍然存在,它只会更短 window .
我还考虑过将 UI 线程领域的自动更新设置为 false,并实现一些逻辑以在检测到更改时手动刷新 UI 线程领域。
还有其他想法吗?
一个common good practice是在层数据模型和领域模型上分离模型。在你的情况下 Activity
或 Adapter
不需要知道 RealmObject
的。 Realm
中的所有 returns 都应转换为 pojo
.
有不同的模型是正常的,这会给你带来优势thread-safety,如果需要的话,更改数据库也会更容易。
数据层模型
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
,所以我认为差异不会很大。
我有一个通过适配器在列表视图中显示 RealmObjects 的项目。领域在每隔几分钟运行一次的 SyncAdapter 中更新。这从服务器中提取数据,并更新领域,这有时会导致 RealmObjects 被删除。当此后台 SyncAdapter 的同步周期完成时,它会发送一个广播,ListView 的托管 activity 会捕获该广播,这会导致 activity 重新查询领域并使用更改后的数据重新填充适配器。
问题是,当用户滚动 ListView 时,适配器正在从领域对象中获取字段以构建视图。如果同步在此时运行,并且从领域中删除了一个对象(通过 SyncAdapter),则应用程序在尝试从已删除的对象构建视图时会崩溃。
处理这种情况的好的模式是什么?我想在 UI 端添加一个领域观察者,并在触发时立即查询并重新设置适配器的 RealmObject 列表,但是竞争条件仍然存在,它只会更短 window .
我还考虑过将 UI 线程领域的自动更新设置为 false,并实现一些逻辑以在检测到更改时手动刷新 UI 线程领域。
还有其他想法吗?
一个common good practice是在层数据模型和领域模型上分离模型。在你的情况下 Activity
或 Adapter
不需要知道 RealmObject
的。 Realm
中的所有 returns 都应转换为 pojo
.
有不同的模型是正常的,这会给你带来优势thread-safety,如果需要的话,更改数据库也会更容易。
数据层模型
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
,所以我认为差异不会很大。