来自UI线程的Android Realm

时间:2016-05-10 15:19:29

标签: android realm

正如我注意到Realm Android数据库不支持在线程之间传递对象。所以我的问题是 - 我应该在UI thread上运行Realm交易还是应该创建一些解决方法?

目前我正在单独的线程上执行查询,并针对基本上复制Realm对象的问题执行某种解决方法:

Address.detach(realm.copyToRealm(address));

TL; DR

RealmUI thread的效果和UX点击是否正在运行?

1 个答案:

答案 0 :(得分:1)

除非您查询大量数据,否则在UI线程上运行Realm查询实际上不会受到性能影响。

示例1:

  • 您在 UI 主题上查询SomeRealmObject;
  • 您可以通过相应的getter方法访问其字段;

查询本身应该足够快。但是当您访问返回的对象时,Realm会执行一些魔术:如果它是第一次访问此数据,那么它将从磁盘读取。否则它已经被缓存,因此读取值不应该是性能问题。

示例2:

  • 您在 WORKER 主题;
  • 上查询SomeRealmObject
  • 你在这个帖子上做了额外的解析或任何其他工作;
  • SomeRealmObject返回给主线程。这完全没问题,因为Realm 支持在不同线程之间传递RealmObject 。 (如官方文档中所述:https://realm.io/docs/java/latest/#threading
  • 然后在主线程中使用此对象。

在这两个示例中,您都可以使用返回的对象进行一些操作。要记住的主要事情是,如果你的对象包含许多字段和嵌套的RealmObject s(和\或RealmList)并且你迫切需要全部读取它们 - 那么你最好在工作线程上进行。选项2是将数据预加载到内存中,然后对其进行处理。问题是Realm不会在你的java堆中存储数据(这就是为什么如果你试图在调试时读取变量值,即使getter返回数据也可能读为null)。但你可以用Realm.copyFromRealm(yourRealmObject)要求它这样做。这将返回非托管RealmModel(一个RealmObject或您提供方法的其他内容)。数据将存储在这个新对象中。

<强> TL; DR 如果您的查询足够重且数据库很大,那么只查询UI线程中的数据库可能会受到性能影响。这包括从返回的RealmModel(RealmObject或RealmResults)访问的其他数据。

选项1:在单独的线程中完成所有工作并传回一些已解析的数据;

选项2:查询您的数据库并从单独的线程预加载所有数据,并在UI线程中使用您的数据,就好像它只是Object中包含一些字段一样。