【问题标题】:realm objects in a listview deleted by background sync causes crash后台同步删除的列表视图中的领域对象导致崩溃
【发布时间】: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


【解决方案1】:

common good practice 是在层数据模型和领域模型上分离模型。在你的情况下ActivityAdapter 不需要知道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,它是唯一的解决方案,所以我认为差异不会很大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多