Refreshing multiple Realm instances at once?

后端 未结 2 1451
不思量自难忘°
不思量自难忘° 2020-12-21 15:38

I\'m using a setup in which every Presenter that is a retained Fragment has its own Realm instance. However, this essentially means th

2条回答
  •  盖世英雄少女心
    2020-12-21 16:09

    A possible way of having an open realm at all times while the application is active.

    public class BaseActivity extends AppCompatActivity {
        private CustomApplication customApplication;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            customApplication = (CustomApplication)getApplication();
            if(savedInstanceState == null) {
                customApplication.incrementActivityCounter();
            }
        }
    
        @Override
        protected void onDestroy() {
            if(isFinishing()) {
                customApplication.decrementActivityCounter();
            }
            super.onDestroy();
        }
    }
    
    public class CustomApplication extends Application {
        public static final String TAG = CustomApplication.class.getSimpleName();
    
        private volatile int activityCounter = 0;
    
        private Realm realm;
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.d(TAG, "Application onCreate() called.");
            initializeRealm();
        }
    
        public void incrementActivityCounter() {
            if (activityCounter == 0) {
                Log.d(TAG, "Increment: Activity counter was 0, initializing Realm.");
                if(realm == null) {
                    initializeRealm();
                }
            }
            activityCounter++;
            Log.d(TAG, "Increment: Activity counter incremented to " + activityCounter + ".");
        }
    
        public void decrementActivityCounter() {
            activityCounter--;
            Log.d(TAG, "Decrement: Activity counter decremented to " + activityCounter + ".");
            if(activityCounter == 0) {
                realm.close();
                realm = null;
                Log.d(TAG, "Decrement: Activity counter was 0, closed realm.");
            }
        }
    
        private void initializeRealm() {
            realm = Realm.getInstance(this);
            Log.d(TAG, "Realm initialized.");
        }
    
        public Realm getRealm() {
            return realm;
        }
    
        public int getActivityCounter() {
            return activityCounter;
        }
    
        public void setActivityCounter(int activityCounter) {
            this.activityCounter = activityCounter; //process death
        }
    }
    

    And then

    public class BaseActivity
            extends AppCompatActivity {
       @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putInt("activityCounter", ((CustomApplication) getApplication()).getActivityCounter());
        }
    
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
            int activityCounter = savedInstanceState.getInt("activityCounter");
            ((CustomApplication) getApplication()).setActivityCounter(activityCounter); //fix process death initializing activity counter to 0
            Log.d(TAG, "Reset activity counter in application after process death to [" + activityCounter + "]");
        }
    }
    

提交回复
热议问题