由后台同步删除的列表视图中的领域对象导致崩溃

时间:2016-01-11 17:57:01

标签: android multithreading android-listview realm

我有一个项目通过适配器在Listview中显示RealmObjects。领域在每隔几分钟运行一次的SyncAdapter中更新。这会从服务器中提取数据,并更新领域,这有时会导致RealmObjects被删除。当这个后台SyncAdapter的同步周期完成时,它发送一个ListView的托管活动捕获的广播,这导致活动重新查询领域并使用更改的数据重新填充适配器。

问题是,当用户滚动ListView时,适配器正在从领域对象中获取字段以构建视图。如果同时运行同步,并且从域中删除对象(通过SyncAdapter),则在尝试从已删除对象构建视图时应用程序崩溃。

处理此案件的好方法是什么?我想在UI端添加一个领域观察者,并在触发时立即查询并重新设置适配器的RealmObject列表,但竞争条件仍然存在,它只是一个较短的窗口。

我还考虑过在UI线程的领域中将自动更新设置为false,并在检测到更改时实现一些逻辑来手动刷新UI线程域。

还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

common good practice是在图层数据模型和域模型上分离模型。在您的情况下,ActivityAdapter无需了解RealmObjectRealm的所有回报都应转换为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合作,那么我认为差异不会很大。