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

时间:2015-11-25 22:05:15

标签: android realm freeze

在Realm的交易中,我的ui正在冻结。在交易过程中获得大量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");

}

2 个答案:

答案 0 :(得分:0)

https://realm.io/docs/java/0.76.0/#writes看起来“写入会相互阻塞,并且如果正在进行其他写入操作,则会阻止它们创建的线程。”是否有可能还在进行另一次写入?

答案 1 :(得分:0)

花了我一些时间,但我能解决这个问题。 Stil不知道确切原因这样做,如果有人可以得到任何信息,那么好:)经过很多次尝试后我终于考虑了我最近在这个项目中改变的所有事情。

我不得不使用Migration&amp;配置,所以在我通过正常的Realm.getInstance(Context上下文)得到一个领域实例之前。我已将我的代码更改为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(context)             .schemaVersion(dbVersion)             .migration(new Migration())             。建立(); Realm.setDefaultConfiguration(realmConfiguration)

  2. App.getCoreRealmInstance方法现在只返回Realm.getDefaultInstance();