Хорошо, этот код, приведенный ниже, решает мою проблему, но после того, как я получаю обновленные объекты списка, я улавливаю такие исключения:
I/art: Background sticky concurrent mark sweep GC freed 5614(449KB) AllocSpace objects, 18(288KB) LOS objects, 33% free, 1691KB/2MB, paused 5.354ms total 10.731ms
I/art: Background sticky concurrent mark sweep GC freed 7039(557KB) AllocSpace objects, 22(352KB) LOS objects, 39% free, 1561KB/2MB, paused 10.554ms total 15.931ms
Очевидно, у докладчика должен быть свой жизненный цикл, и где-то нам нужно удалитьliveData.В моей модели:
public RealmLiveData<Anime> findAnimes() {
Realm realm = Realm.getDefaultInstance();
RealmLiveData<Anime> realmLiveData;
try {
realmLiveData = new RealmLiveData<>(realm.where(Anime.class).findAllAsync());
} finally {
if (realm != null) {
realm.close();
}
}
return realmLiveData;
}
В моем докладчике:
@Override
public void loadData() {
view.onDataStarted();
repository.getAnimeFromNetwork();
liveData = repository.findAnimes();
liveData.observeForever(new Observer<RealmResults<Anime>>() {
@Override
public void onChanged(@Nullable RealmResults<Anime> animes) {
if (animes != null) {
if (animes.size() == 0) {
//nothing
System.out.println("Result realmResult: " + animes.size());
} else {
view.onDataCompleted();
System.out.println("My result before Background sticky concurrent mark sweep GC: " + animes.size());
List<Anime> animeList = new ArrayList<>();
animeList.addAll(animes);
view.showData(animeList);
//Trying to stop liveData - helplessness
liveData.removeObserver(this::onChanged);
}
} else {
System.out.println("null" + animes);
}
}
});
RealmLiveData:
public class RealmLiveData<T extends RealmModel> extends LiveData<RealmResults<T>> {
private RealmResults<T> results;
private final RealmChangeListener<RealmResults<T>> listener =
new RealmChangeListener<RealmResults<T>>() {
@Override
public void onChange(RealmResults<T> results) {
setValue(results);
}
};
public RealmLiveData(RealmResults<T> realmResults) {
results = realmResults;
}
@Override
protected void onActive() {
results.addChangeListener(listener);
}
@Override
protected void onInactive() {
results.removeChangeListener(listener);
}