我在项目中使用Realm。我构建了这个RealmActivity,可以在代码中使用getActivity.getRealm()轻松使用Realm。
public abstract class RealmActivity extends AppCompatActivity {
private Realm realm;
@Override
protected void onCreate(Bundle savedInstanceState) {
realm = Realm.getDefaultInstance();
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (!realm.isClosed()) {
realm.close();
}
}
public Realm getRealm() {
return realm;
}
现在我想删除Realm文件以清除此会话/用户的数据。为此,必须关闭所有RealmInstances。我试图启动一个Logout-Activity,意图清除activityStack。它适用于我的Nexus 5(Android 6),但不适用于我的Nexus 4(Android 5)。
我的想法是为RealmInstance创建一个Singleton,用于UI-Thread
public abstract class RealmActivity extends AppCompatActivity {
private Realm realm;
@Override
protected void onCreate(Bundle savedInstanceState) {
realm = ManagerLayer.getInstance().getRealm();
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public Realm getRealm() {
return realm;
}
}
现在,我只有一个实例,可以在删除文件之前将其关闭。但是当我没有退出时,我从不关闭RealmInstance。这是一个问题吗?
但是当我清除ActivityStack并且没有调用onDestroy()方法时,Activity的RealmInstance也永远不会被关闭。正确?
我可以在UI-Thread realmInstance中使用Singleton吗?我从来没有将它传递给另一个线程,也从未关闭它。 或者是否有其他解决方案可以关闭所有RealmInstances来删除RealmFile?
答案 0 :(得分:2)
如果要保留整个应用程序所需的某个对象的实例,则应将此实例保留在:
Application
类,对其进行扩展并在android:name
中设置AndroidManifest.xml
。谈论生命周期,如果你有一些关闭Realm实例的动作,这就足够了,只需在你的单例中创建一个清晰的方法并正确调用它。
如果不是这种情况,您必须记住,您永远不能保证调用onDestroy
方法,但如果您因为该过程已被杀死而未释放资源,你根本不必担心,因为当一个进程被杀死时,所有未持久存在的对象都将被完全释放,即使它们正在使用文件系统或网络。