在UI-Thread中使用Singleton for Realm

时间:2015-12-14 16:55:25

标签: android realm

我在项目中使用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?

1 个答案:

答案 0 :(得分:2)

如果要保留整个应用程序所需的某个对象的实例,则应将此实例保留在:

  1. Application类,对其进行扩展并在android:name中设置AndroidManifest.xml
  2. 另一个不是Android组件的类,一个简单的java类。
  3. 谈论生命周期,如果你有一些关闭Realm实例的动作,这就足够了,只需在你的单例中创建一个清晰的方法并正确调用它。

    如果不是这种情况,您必须记住,您永远不能保证调用onDestroy方法,但如果您因为该过程已被杀死而未释放资源,你根本不必担心,因为当一个进程被杀死时,所有未持久存在的对象都将被完全释放,即使它们正在使用文件系统或网络。