2016-01-11 3 views
1

У меня есть проект, который отображает RealmObjects в Listview через адаптер. Область обновляется в SyncAdapter, который запускается каждые несколько минут. Это извлекает данные с сервера и обновляет область, что иногда приводит к удалению RealmObjects. Когда этот синхронизирующий цикл синхронизирующего фона завершен, он отправляет широковещательную передачу, которую улавливает хостинг-активность ListView, что заставляет операцию повторно запрашивать область и повторно заполнять адаптер с измененными данными.объекты realm в списке, удаленные фоновой синхронизацией, приводят к сбою

Проблема в том, что когда пользователь прокручивает ListView, адаптер извлекает поля из объектов области для создания представлений. Если синхронизация выполняется в это время, и объект удаляется из области (через SyncAdapter), приложение вылетает при попытке создать представление из удаленного объекта.

Что такое хороший шаблон для решения этого дела? Я подумал о том, чтобы добавить наблюдателя в реальном времени на стороне пользовательского интерфейса и немедленно запросить и переустановить список RealmObject адаптера, когда он срабатывает, однако состояние гонки все равно останется, это будет просто более короткое окно.

Я также подумал о том, чтобы установить автоматическое обновление в false в области потока пользовательского интерфейса и реализовать некоторую логику, чтобы вручную обновить область потоков пользовательского интерфейса при обнаружении изменения.

Любые другие идеи?

+2

Если ваш адаптер синхронизации работает на фоновом потоке. Достаточно зарегистрировать ChangeListener в RealmResults и обновить ListAdapter при его запуске. Единственный раз, когда вы должны столкнуться с сбоями из-за удаленных объектов, - если вы держите ссылки на них вне области обновления. –

ответ

1

A common good practice является разделение моделей на модели данных уровня и модели домена. В вашем случае Activity или Adapter не нужно знать о RealmObject. Все доходы от Realm должны быть преобразованы в pojo.

Это нормально, когда у вас разные модели, это даст вам преимущество по обеспечению безопасности потоков, и при необходимости будет легче изменить базу данных.

Datalayer модель

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; 
    } 

} 

Mapper

public class EventMapper { 
    public Event map(RealmEvent event) { 
    ... 
    } 
} 

Возможно, это так незначительное влияние на производительность. Но до декабря 2015 года это было единственное решение, если вы хотите работать с RxJava, поэтому я думаю, что разница не будет сильной.

Смежные вопросы