How to use Shared Preferences in MVP without Dagger and not causing Presenter to be Context dependent?

前端 未结 4 1772
北恋
北恋 2020-12-23 11:51

I\'m trying to implement MVP without Dagger (for learning purposes). But I got to the problem - I use Repository patter to get raw data either from cache (Shared Preferences

4条回答
  •  一向
    一向 (楼主)
    2020-12-23 12:17

    This is how I do it. I have a singleton "SharedPreferencesManager" class that will handle all the read write operations to shared prefs like below

    public final class SharedPreferencesManager {
        private  static final String MY_APP_PREFERENCES = "ca7eed88-2409-4de7-b529-52598af76734";
        private static final String PREF_USER_LEARNED_DRAWER = "963dfbb5-5f25-4fa9-9a9e-6766bfebfda8";
        ... // other shared preference keys
    
        private SharedPreferences sharedPrefs;
        private static SharedPreferencesManager instance;
    
        private SharedPreferencesManager(Context context){
            //using application context just to make sure we don't leak any activities
            sharedPrefs = context.getApplicationContext().getSharedPreferences(MY_APP_PREFERENCES, Context.MODE_PRIVATE);
        }
    
        public static synchronized SharedPreferencesManager getInstance(Context context){
            if(instance == null)
                instance = new SharedPreferencesManager(context);
    
            return instance;
        }
    
        public boolean isNavigationDrawerLearned(){
            return sharedPrefs.getBoolean(PREF_USER_LEARNED_DRAWER, false);
        }
    
        public void setNavigationDrawerLearned(boolean value){
            SharedPreferences.Editor editor = sharedPrefs.edit();
            editor.putBoolean(PREF_USER_LEARNED_DRAWER, value);
            editor.apply();
        }
    
        ... // other shared preference accessors
    }
    

    Then whenever access to shared preference is needed I pass the SharedPreferencesManager object in the relevant Presenter's constructor. For example :

    if(null == presenter){
        presenter = new Presenter(SharedPreferencesManager.getInstance(getApplicationContext()));
    }
    

    Hope this helps!

提交回复
热议问题