我每秒都运行一个线程,每秒更新一次Realm数据库字段。虽然更新的数据很小,但我发现更新仍会增加数据库文件大小,直到您使用Realm.compressRealm()
明确清除它,因此在一两个小时内数据库大小为50MB +并且很容易膨胀到750MB +以上也是一段短暂的时期。
我正在活动realm.close()
中使用onStop()
关闭Realm,并关闭我在计时器线程中创建的新Realm实例:
public void checkDealersTimer() {
RealmResults<Dealers> dealersLookup = realm.where(Dealers.class).equalTo("thedealers","thedealers").findAll();
dlr = dealersLookup.get(0);
if (dlr.getPerSecond() != 0.00) {
if (dealerTimer == null) {
dealerTimer = new Timer();
dealerTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Realm drealm;
drealm = Realm.getDefaultInstance();
RealmResults<Dealers> dealersLookup = drealm.where(Dealers.class).equalTo("thedealers","thedealers").findAll();
dlr = dealersLookup.get(0);
drealm.beginTransaction();
dlr.setEarnings(dlr.getEarnings()+dlr.getPerSecond());
drealm.commitTransaction();
drealm.close();
}
}, 0, 1000);
}
}
}
这个计时器是我在UI线程之外使用Realm的唯一地方,也是我更新频率的唯一地方,所以我假设“泄漏”来自这里虽然我不能确定。应用程序可见或不可见文件大小,但只有在它运行时才会出现。
这是另一个有类似问题的用户: App size increase due to realm android
如果认为这是解决方案,我找不到正确的方法来调用Realm.compressRealm()
,因为db应该在你使用它时每秒更新一次,而且我只能关闭Realm { {1}}不onDestroy()
(而onStop()
要求您关闭所有领域)
感谢您的任何意见,谢谢!
答案 0 :(得分:3)
我遇到了一个问题,即我的领域文件大小以惊人的速度增加,并且当应用程序在开发期间意外关闭时,这是一个不调用close()
的问题。因此我的数据库文件(其中只有大约1k项)是10MB。正确关闭我的领域实例解决了问题,并将我的数据库文件大小减少到~300KB。真的,值得检查整个代码库,以确保实际上关闭所有领域实例。这很麻烦,但比用户抱怨存储空间不足更好;)
根据您上面的示例,我建议您还使用领域提供的executeTransaction方法(而不是开始/提交事务):
drealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
dlr.setEarnings(dlr.getEarnings() + dlr.getPerSecond());
}
});
drealm.close();