2016-06-23 4 views
2

Ich versuche, eine Listview mit einer Realm-Tabelle verknüpft zu haben, also wenn ein Element zur Tabelle hinzugefügt wird, sollte die Listview aktualisiert werden. Das Problem ist, dass RealmChangeListener nicht aufgerufen wird, wenn das Element hinzugefügt wird.RealmChangeListener nicht aufgerufen

Realm real = RealmController.getInstance(getContext()); // Singleton 
RealmResults<Friend> friends = real.where(Friend.class).findAllAsync(); 
friends.addChangeListener(callback); 

RealmChangeListener<RealmResults<Friend>> callback=new RealmChangeListener<RealmResults<Friend>>() { 
    @Override 
    public void onChange(RealmResults<Friend> element) { 
     // This is only called on async completed but not later 
    } 
}; 

Der Speichervorgang wird in einer retrotif Antwort getan:

new MyService(context).userService().getFriends().enqueue(new Callback<FriendResponse>() { 
     @Override 
     public void onResponse(Call<FriendResponse> call, Response<FriendResponse> response) { 
      Realm realm = RealmController.getInstance(context); // singleton 
      realm.beginTransaction(); 
      realm.copyToRealmOrUpdate(response.body().friends); 
      realm.commitTransaction(); 
     } 

     @Override 
     public void onFailure(Call<AllInfoResponse> call, Throwable t) { 

     } 
    }); 

Wissen Sie, was geschieht? Irgendein Vorschlag?

+2

Der changelistener wird nicht aufgerufen, wenn du entweder den Realm auf dem UI-Thread geschlossen hast oder wenn deine Freunde RealmResults GC'ed wurden. –

+0

Ich rufe Close nicht explizit an. Tatsächlich hilft das Singleton, eine Live-Instanz zu erhalten. Also sende ich, dass Freunde GC'ed ist, werde ich versuchen, es als Klassenattribut setzen –

+1

@ChristianMelchior, legte ich RealmResults Freunde; als Klassenattribut und es funktioniert! Wenn Sie es als Lösung schreiben, werde ich es als korrekt markieren. –

Antwort

1

Ich habe einige Probleme mit Ihrer genauen Situation erfahren (Nachrüstung Anruf und Benutzeroberfläche über RealmChangeListener aktualisiert) und ich wollte gerade eine neue Frage stellen, aber ich habe es gerade herausgefunden.

In meinem Fall implementiert ich die RealmChangeListener in meinem ArrayAdapter, die ich finden Reiniger: mein Retrofit Service in der Tätigkeit des onCreate und irgendwie

public class ListAdapter extends ArrayAdapter<Item> implements 
     RealmChangeListener<RealmResults<Item>> { 

    private final List<Item> items; 

    public ListAdapter(Context context, RealmResults<Item> items) { 
     super(context, R.layout.listitem_item); 
     this.items = items; 
     items.addChangeListener(this); 
    } 

    @Override 
    public void onChange(RealmResults<Restaurant> element) { 
     notifyDataSetChanged(); 
    } 

    ... 
} 

In eine andere Situation, war ich die Ansichten der Initialisierung und Aufruf Der Hörer wurde nicht angeschlossen, bevor er die Antwort erhalten hat. Also, eine andere Sache, die ich tat, rief Retrofit in der onPostCreate Methode an und stellte sicher, dass der Listener bereit ist.

public class ItemListActivity BaseActivity implements 
     RealmChangeListener<RealmResults<Item>>, 
     Callback<GetItemsResponse> { 

    private long id; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_item_list); 

     RealmResults<Item> items = getRealm() 
       .where(Item.class) 
       .findAll(); 

     items.addChangeListener(this); 

     setupUI(items); 
    } 

    @Override 
    protected void onPostCreate(@Nullable Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 

     MyRetrofitClient 
       .getInstance(this) 
       .getItems() 
       .enqueue(this); 
    } 

    @Override 
    public void onResponse(Call<GetItemsResponse> call, final Response<GetItemsResponse> response) { 
     getRealm().executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       List<Item> newItems = response.body().getNewItems(); 
       realm.copyToRealmOrUpdate(newItems); 
      } 
     }); 
    } 

    @Override 
    public void onChange(RealmResults<Item> items) { 
     updateUI(); 
    } 

    ... 
} 

Hoffe, dass dies hilft!