2016-10-07 2 views
1

Я не могу получить запросы на запросы Realm Query для Android в Android с помощью Kotlin. Я попробовал полный (1) и лямбда (2) синтаксис для этого отдельно:Уведомление о запросе на Realm не срабатывает с использованием Kotlin

object DataService { 

    val realm: Realm = Realm.getDefaultInstance() 

    var allDogs: RealmResults<Dog> = realm.where(Dog::class.java).findAll() 

    fun start() { 

     // (1) 
     allDogs.addChangeListener(object: RealmChangeListener<RealmResults<Dog>> { 
      override fun onChange(element: RealmResults<Dog>?) { 
       print("Ping?") 
      } 
     }) 

     // (2) 
     allDogs.addChangeListener { 
      // This listener doesn't fire when I create managed the Dog object below 
      print("Ping?") 
     } 

     realm.executeTransaction { 
      realm.createObject(Dog::class.java) 
     } 
    } 
} 

мне интересно, если это имеет отношение к этой линии от документации:

Изменить слушателей работают только с потоками Looper. Для потоков non-looper, , вы должны вручную использовать Realm.waitForChange().

+0

При попытке зарегистрировать прослушиватель в потоке, который его не поддерживает, вы получите исключение. Так что здесь должно быть что-то еще. Возможно, вы закрываете Царство до того, как произойдет обратный вызов? –

+0

@ChristianMelchior Это полезно знать. Нет, я не закрываю Царство. –

+0

Слушатели также не будут вызываться, если RealmResults будет GC'ed. Однако похоже, что вы создаете одноэлементный объект, который не должен быть GC'ed? –

ответ

0

Это происходит не потому, что вы используете kotlin, но потому, что вы не храните ссылки на объекты RealmResult, если вы создаете для них слушателей, сначала сохраняйте результаты как свойства или члены класса, а затем добавьте слушателей.

Смежные вопросы