Realm Android: асинхронная транзакция влияет на поток пользовательского интерфейса
В настоящее время я использую область для запроса объектов RealmObjects, чтобы показать их в GoogleMap. Я выполняю чтение и получаю RealmResults, но я не могу найти способ поместить маркеры на карту из потока пользовательского интерфейса. Я бы предпочел сделать это с асинхронным вызовом, потому что это вызывает ~150 мс задержки в потоке пользовательского интерфейса.
public void loadLocations(final GoogleMap googleMap) {
try {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<LocationObject> locations = realm.where(LocationObject.class).findAll();
for (LocationObject location: locations ) {
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(location.lat, location.long))
}
}
});
}
Как я могу позже получить доступ к RealmResults в потоке пользовательского интерфейса? Realm упоминает, что RealmObjects ограничены потоками
1 ответ
Вы можете попробовать использовать RealmChangeListener
, Документы Realm иллюстрируют это очень ясно на примере щенков.
RealmResults<LocationObject> locations;
//...
locations = realm.where(LocationObject.class).findAllAsync();
locations.addChangeListener(new RealmChangeListener<Person>() {
@Override
public void onChange(RealmResults<LocationObject> locations) {
googleMap.clear();
for (LocationObject location: locations) {
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(location.lat, location.long));
}
}
}
Приведенный выше код в основном делает запрос асинхронно с базой данных Realm и addChangeListener
регистрирует метод обратного вызова, который будет вызван, когда запрос будет выполнен, и будет также вызываться в будущих вызовах запроса (дополнительную информацию см. в документации области).
Итак, я бы предложил запустить приведенный выше код в onStart
или же onResume
метод и не забудьте удалить прослушиватель изменений на onStop
или же onPause
метод, вот так:
locations.removeChangeListeners();
Наконец, не забудьте закрыть царство. Надеюсь, поможет! Не стесняйтесь спрашивать, если что-то неясно.