领域事务导致 GC 扫描 ui 冻结

Realm transaction causes GC sweep ui freeze

我的 ui 在 Realm 中进行交易时冻结。在事务期间进行大量 GC 扫描:

Starting a blocking GC Explicit
Explicit concurrent mark sweep GC freed 21(1312B) AllocSpace objects, 0(0B) LOS objects, 13% free, 106MB/122MB, paused 480us total 24.157ms

这是我第一次遇到这个问题。一直在很多项目中使用 Realm 而没有遇到这样的事情。即使删除所有代码并只保留 realm.begintransaction 和 realm.committransaction 调用它也会冻结,所以我将问题归结为事务本身。但考虑到如果开始和提交之间没有任何内容也会发生这种情况,这与大小或查询本身无关。

public static void insertValueForKeyInSession(final String sessionUuid, final String key, final String value){
    Realm realm = App.getCoreRealmInstance(App.getContext());

    RealmQuery<DataResponse> query = realm.where(DataResponse.class);
    query.equalTo("sessionUuid", sessionUuid);
    query.equalTo("key", key);
    final RealmResults<DataResponse> result = query.findAll();

    if (result.size() > 0) {
        DataResponse response = result.get(0);

        realm.beginTransaction();
        response.setValue(value);
        realm.commitTransaction();

    } else {
        DataResponse dataResponse = new DataResponse();
        String uuid = UUID.randomUUID().toString();
        dataResponse.setSessionUuid(sessionUuid);
        dataResponse.setUuid(uuid);
        dataResponse.setKey(key);
        dataResponse.setValue(value);
        realm.beginTransaction();
        realm.copyToRealm(dataResponse);
        realm.commitTransaction();
    }
    realm.close();
    Log.d(TAG,"insertValue Stopped");

}

https://realm.io/docs/java/0.76.0/#writes 看来 "writes block each other, and will block the thread they are made on if other writes are in progress." 是否有可能正在进行另一次写入?

花了我一些时间,但我能够解决这个问题。仍然不知道确切的原因,如果有人能得到任何相关信息,那就太好了:)经过很多次尝试,我终于想到了我最近在这个项目中改变的所有事情。

我必须使用迁移和配置,所以之前我会通过正常 Realm.getInstance(上下文上下文)获得领域实例。我已将代码更改为 App.getCoreRealmInstance(App.getContext()).. 此方法:

RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(context)
                .schemaVersion(dbVersion)
                .migration(new Migration())
                .build();
return Realm.getInstance(realmConfiguration);

我所做的更改:

  1. 以下方法仅在启动时调用一次并设置默认配置..

    RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(上下文) .schemaVersion(dbVersion) .migration(新迁移()) 。建造(); Realm.setDefaultConfiguration(领域配置)

  2. App.getCoreRealmInstance方法现在只有returns Realm.getDefaultInstance();