如何在整个应用生命周期中维护单个 Realm 实例并关闭它



如何在应用程序的整个生命周期中维护单个 Realm 实例并关闭它?

我可以使用单一实例类实现维护实例,但是如何在应用程序关闭时关闭它?

另外,一旦打开领域实例,不关闭它是否安全?

我倾向于对 UI 线程使用单例RealmManager,对于后台线程,我使用 try-with-sources 块打开/关闭 Realm。

所以对于 UI 线程:

public class RealmManager {
    private static final String TAG = "RealmManager";
    static Realm realm;
    static RealmConfiguration realmConfiguration;
    public static void initializeRealmConfig(Context appContext) {
        if(realmConfiguration == null) {
            Log.d(TAG, "Initializing Realm configuration.");
            setRealmConfiguration(new RealmConfiguration.Builder(appContext).initialData(new RealmInitialData())
                    .deleteRealmIfMigrationNeeded()
                    .inMemory()
                    .build());
        }
    }
    public static void setRealmConfiguration(RealmConfiguration realmConfiguration) {
        RealmManager.realmConfiguration = realmConfiguration;
        Realm.setDefaultConfiguration(realmConfiguration);
    }
    private static int activityCount = 0;
    public static Realm getRealm() {
        return realm;
    }
    public static void incrementCount() {
        if(activityCount == 0) {
            if(realm != null) {
                if(!realm.isClosed()) {
                    Log.w(TAG, "Unexpected open Realm found.");
                    realm.close();
                }
            }
            Log.d(TAG, "Incrementing Activity Count [0]: opening Realm.");
            realm = Realm.getDefaultInstance();
        }
        activityCount++;
        Log.d(TAG, "Increment: Count [" + activityCount + "]");
    }
    public static void decrementCount() {
        activityCount--;
        Log.d(TAG, "Decrement: Count [" + activityCount + "]");
        if(activityCount <= 0) {
            Log.d(TAG, "Decrementing Activity Count: closing Realm.");
            activityCount = 0;
            realm.close();
            if(Realm.compactRealm(realmConfiguration)) {
                Log.d(TAG, "Realm compacted successfully.");
            }
            realm = null;
        }
    }
}

对于后台线程:

try(Realm realm = Realm.getDefaultInstance()) {
   // ...
}

为什么不为您的 realm 实例(可能是单例(创建一个包装类,然后向其添加一些方法,这样您就不必每次都关闭 Realm,而是可以调用自己的方法并在完成后立即关闭使用的实例?像这样的东西。

public class WrappingRealm {
    public static WrappingRealm getInstance() {
        //create your singleton here. Be aware of synchronization issues
    }
    private Realm getRealm() {
        return Realm.getDefaultInstance();
    }
    public void save(RealmModel obj)  {
        Realm currentRealm = getRealm();
        currentRealm.executeTransaction {
            //Do your stuff
        }
        currentRealm.close();
    }
}

最新更新