“二级”
.realm
文件是指不是default.realm
文件的领域文件。
我有两个.realm
文件-一个是标准default.realm
,另一个是aux.realm
。
在正常情况下,事情可以正常进行,但是当我在工作线程上执行繁重的操作(多个表经过.deleteAllFromRealm()
并重新同步所有内容)时,用户仍然可以自由执行任何操作UI活动,只要执行涉及aux.realm
实例的任何交互,该应用都会使用ANR关闭。
通过一些广泛的调试,我发现getAuxRealmInstance
花费了很多时间来传递实例,即使它的值应该被缓存。尽管事实上它的配置已经延迟加载了。因此,尚不清楚为什么要花费这么多时间?
我也可能是事务问题,因为一次只能有一个活动事务,但是我不确定这是否对文件也有效,就像两个领域文件是否有自己的规则一样transactions
并行运行?
我的aux.realm
文件:
private const val FILE_NAME = "auxiliary.realm"
private val auxiliaryConfiguration = lazy {
RealmConfiguration.Builder()
.name(FILE_NAME)
.schemaVersion(AuxiliarySchemaVersionMappings.CURRENT_SCHEMA_VERSION)
.modules(AuxiliaryRealmModule())
.initialData {
Log.d("AuxRealm", "running initial data migration: ")
// initial version..
// migrate the AppMetaData table from base realm to aux realm
}
}
.migration(AuxiliaryRealmMigration())
.build().also { Log.d("AuxRealm", "configuration created: ") }
}
fun getAuxiliaryRealmInstance(): Realm{
return Realm.getInstance(auxiliaryConfiguration.value)
}
fun getAuxiliaryRealmInstanceAsync(callback: Realm.Callback): RealmAsyncTask{
return Realm.getInstanceAsync(auxiliaryConfiguration.value, callback)
}
PS:如果我以异步方式加载aux领域实例,则ANR消失,如上所述,这指向相同的问题。
Env变量:领域:5.4.2,Kotlin 1.2.51
答案 0 :(得分:0)
我通过缓存领域实例解决了这个问题:
private Realm auxiliaryRealmInstance;
fun getAuxiliaryRealmInstance(): Realm{
return auxiliaryRealmInstance == null ? Realm.getInstance(auxiliaryConfiguration.value) : auxiliaryRealmInstance;
}
此变通办法应该是不必要的,因为here的写法是缓存不会使任何事情变得更有效率。但到目前为止,我还没有发现任何不利之处。