android - 在 UI 线程中使用单例作为 Realm

标签 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 文件以清除该 session /用户的数据。为此,必须关闭所有 RealmInstance。我尝试启动注销 Activity , Intent 清除 ActivityStack。它适用于我的 Nexus 5 (Android 6),但不适用于我的 Nexus 4 (Android 5)。

我的想法是为 RealmInstance 创建一个单例,它在 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 Realm 实例使用单例吗?我从不将它传递给另一个线程,也从不关闭它。 或者是否有另一种解决方案来关闭所有 RealmInstances 以删除 RealmFile?

最佳答案

如果您想保留整个应用程序所需的某个对象的实例,您应该将该实例保留在:

  1. Application 类,对其进行扩展并在 AndroidManifest.xml 中设置 android:name
  2. 另一个不是 Android 组件的类,一个简单的 java 类。

谈论生命周期,如果您有一些关闭 Realm 实例的操作,这就足够了,只需在您的单例中创建一个明确的方法并正确调用它即可。

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

关于android - 在 UI 线程中使用单例作为 Realm ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34272502/

相关文章:

android - Recyclerview 项目在刷新时混淆

sqlite - 离线优先方法和 PWA 的区别?

swift - Realm 中的嵌套对象

android - Android GridView 中图像之间的空间

android - map 上点之间的方向?

swift - 是否可以在 Realm 的过滤器中使用@max?

android - 从 realm.io 中删除项目发生了什么? Realm 异常 "Removing object is not supported."?

ios - swift 3 : Realm creates additional object instead of updating the exisiting one

android - 在填充的 android Canvas 上绘制一个透明圆圈

java - 如何从 SQLiteOpenHelper 访问 StartActivityForResult()?