2016-05-11 3 views
2

die RealmChangeListener nicht so funktioniert, wie ich erwartet hatte, hier ist das, was ich damit tun:Realm RealmChangeListener ein Verhalten hat verstehe ich nicht

public ArrayList<NotificationMessage> getNotifications(RealmChangeListener<RealmResults<NotificationMessage>> listener) { 
    RealmResults<NotificationMessage> results = realm.where(NotificationMessage.class).findAll(); 
    results.addChangeListener(listener); 
    return (ArrayList) realm.copyFromRealm(results); 
} 

public void addNotification(NotificationMessage notif) { 
    realm.beginTransaction(); 
    realm.copyToRealm(notif); 
    realm.commitTransaction(); 
} 

Basicly I Realm bin mit gcm Nachrichten zu speichern. Meine GCMListenerService Anrufe addNotification() wenn er erhält, und ich habe ein Fragment, das Benachrichtigungen zeigt Thesen, die getNotifications(this) aufrufen, wenn es erstellt wird. Es implementiert RealmChangeListener<RealmResults<NotificationMessage>>:

@Override 
public void onChange(RealmResults<NotificationMessage> element) { 
    RecyclerAdapter.refreshDataSet(Realm.getDefaultInstance().copyFromRealm(element)); 
} 

Mein Problem ist, dass die meiste Zeit onChange() wird nicht aufgerufen. Manchmal ist es, manchmal mehrmals hintereinander, und dann wird es nicht erneut aufgerufen (ohne etwas anderes zu tun, als meine Webseite zu aktualisieren, die die Nachricht an GCM sendet). Die Benachrichtigungen werden gut in der Datenbank gespeichert, wenn ich wieder getNotifications rufe, sehe ich sie alle.

Ich begann heute Morgen mit Reich würde ich so apprieciate, wenn Sie Vorschläge haben, wie ich meine „Realm“ Code zu organisieren.


public static <T extends RealmObject> ArrayList<T> convertRealmToPlainObject(RealmResults<T> results) { 
    ArrayList<T> returnedData = new ArrayList<>(); 
    Iterator<T> it = results.iterator(); 
    while (it.hasNext()) { 
     returnedData.add(it.next()); 
    } 
    return returnedData; 
} 
+0

Was ist convertRealmToPlainObject? –

+0

Es ist nur ein einfaches util: Ich habe es hinzugefügt –

+0

@TimCastelijns worüber hast du nachgedacht? –

Antwort

2

Aus Ihrer Beschreibung ist es schwierig, spezifische Ratschläge zu geben, aber ein paar Hinweise:

  • ändern Zuhörer nur auf Looper Ereignisse ausgelöst. Also, wenn Sie mehrere Schreibvorgänge während der Behandlung eines Ereignisses haben. Es wird nur einen Anruf onChange auslösen.

  • das Reich schließen bedeutet, dass Veränderung Zuhörer werden nicht länger ausgelöst werden.

  • Change funktioniert nicht auf einfachen Objekten.

+0

Vielen Dank, verstehe ich nicht gut Ihre Looper Punkt (nicht a Muttersprachler). Soll Realm von einem Looper-Thread abonniert werden? Ich interessiere mich nicht wirklich für einen oder mehrere onChange-Aufrufe, wenn mehrere Schreibvorgänge auftreten, mein Problem ist, dass onChange manchmal nie wieder aufgerufen wird. Ich rufe nur close(), wenn ich das Fragment zerstören, das den "OnChange" Listener implementiert, also denke ich, es ist in Ordnung. Die Konvertierung zu einfachen Objekten erfolgt im onChange, also sollte es in Ordnung sein, oder? –

+0

Auch sollte ich gesagt haben: manchmal auf Änderung heißt nie –

+0

@Chritian Melchior, ich abonniert von einem Greifer-Thread und es funktioniert wie ein Charme. Danke für den Tipp ! –