2016-01-11 31 views
1

我有一個項目通過適配器在列表視圖中顯示RealmObjects。該領域在每幾分鐘運行一次的SyncAdapter中進行更新。這從服務器拉取數據,並更新領域,有時會導致RealmObjects被刪除。當此後臺SyncAdapter的同步週期完成時,它會發送ListView的託管活動捕獲的廣播,這會導致該活動重新查詢領域並使用更改後的數據重新填充適配器。通過背景同步刪除的列表視圖中的領域對象導致崩潰

問題是,當用戶滾動ListView時,適配器正在從領域對象中獲取字段以構建視圖。如果當時同步運行,並且從領域(通過SyncAdapter)刪除了一個對象,則應用程序在嘗試從已刪除的對象構建視圖時會崩潰。

什麼是處理這種情況的好模式?我想在UI方面添加一個領域觀察器,並在發生火災時立即查詢和重新設置適配器的RealmObject列表,但競爭條件仍然存在,它只是一個較短的窗口。

我也想過在UI線程的領域設置自動更新爲false,並實施一些邏輯手動刷新UI線程領域時,檢測到更改。

還有其他想法嗎?

+2

如果您的同步適配器在後臺線程上運行。在RealmResults上註冊ChangeListener並在觸發時刷新ListAdapter就足夠了。唯一一次由於刪除對象而導致崩潰的情況是,如果您在刷新範圍之外保留對它們的引用。 –

回答

1

A 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合作,所以我認爲差異不會很大。