我目前在Android应用程序上使用Realm数据库,根据用户定义的过滤器检索数据并与远程数据库同步。在提出几个请求后,应用程序工作得很好(它消耗大约30 MB的内存,没关系,考虑到我正在使用其他组件和服务,如地图等)。但是,当关闭应用程序(在最近的应用程序列表上滑动)并重新启动它时,在两次或三次查询后,内存消耗开始显着增加(超过100 MB),因此进行查询需要很长时间,最后应用程序因崩溃而崩溃OutOfMemoryError
。跟踪Android Studio上的应用程序实例我看到很多io.realm.internal.NativeObjectReference
。
根据领域文档,我尝试了两件事,但没有成功:
在类构造函数中获取带有Realm.getDefaultInstance()
的Realm实例,该构造函数负责查询Realm数据库,并在主要活动中使用mRealm.close()
方法从onDestroy
关闭数据库
在开始数据库操作之前获取具有Realm.getDefaultInstance()
的Realm实例,并在操作结束后立即关闭它。通过异步操作,我可以做这样的事情
mRealm = Realm.getDefaultInstance();
mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//perform transaction
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
mRealm.close();
//notify calling function
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
mRealm.close();
}
});
使用非异步操作我做了类似这样的事情
mRealm = Realm.getDefaultInstance();
RealmResults<DealLocal> dealLocals = mRealm.where(DealLocal.class).findAll();
mRealm.close();
我在两个类中使用Realm.getDefaultInstance()
:一个用于与远程数据库同步,另一个用于进行用户定义的查询。但是,此时所有调用都是从主活动进行的,并且我保证在数据库上只有一个操作同时进行(即我先同步然后进行用户定义的查询)。当由于内存使用过多导致查询耗时过长而导致应用程序终止时(在最近的应用列表中滑动),内存使用量不会恢复正常。
如何以正确的方式处理我的应用程序上的领域实例和操作以避免此问题?