正如我注意到Realm
Android
数据库不支持在线程之间传递对象。所以我的问题是 - 我应该在UI thread
上运行Realm交易还是应该创建一些解决方法?
目前我正在单独的线程上执行查询,并针对基本上复制Realm
对象的问题执行某种解决方法:
Address.detach(realm.copyToRealm(address));
TL; DR
Realm
对UI thread
的效果和UX
点击是否正在运行?
答案 0 :(得分:1)
除非您查询大量数据,否则在UI线程上运行Realm
查询实际上不会受到性能影响。
示例1:
SomeRealmObject
; 查询本身应该足够快。但是当您访问返回的对象时,Realm会执行一些魔术:如果它是第一次访问此数据,那么它将从磁盘读取。否则它已经被缓存,因此读取值不应该是性能问题。
示例2:
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
中包含一些字段一样。