2017-08-11 19 views
1

私のプロジェクトをリファクタリングしたいのですが、ハードコードされた文字列で不必要なコードがたくさんあります。だから、シングルトンのSharedPrefsManagerを作成したかったので、私はアプリケーションコンテキストを使用します。私のマネージャークラスの静的なSharedPrefsのメモリリークの原因が発生します。Androidの共有コンテキストでのシングルトンのコンテキスト

public class SharedPrefsManager { 

    private static SharedPrefsManager sharePref = new SharedPrefsManager(); 
    private static SharedPreferences sharedPreferences; 

    private SharedPrefsManager() {} 


    public static SharedPrefsManager getInstance(Context context) { 
     if (sharedPreferences == null) { 
      sharedPreferences = context.getSharedPreferences(context.getPackageName(), Activity.MODE_PRIVATE); 
     } 
     return sharePref; 
    } 

} 
+1

の事ならば、なぜあなたはクラスのインスタンスが必要になるが含まれていないため、静的フィールドにSharedPreferencesを保持するメモリリークを引き起こしませんあなたはそれに '静的な'もあります。 'SharedPreferences'を非静的にします。 – Vucko

+0

アプリケーションのコンテキストは、アプリケーションが生存していて、アクティビティのライフサイクルに依存しないので、このケースではメモリリークが発生しない限り存続します –

答えて

0

いいえ、アプリケーションコンテキストを使用するとメモリリークは発生しません。シングルトンとしてSharedPrefsManagerを作成し、Applicationクラスから初期化します。あなたは、コンテキストなしで他のクラスから使用できるように、あなたはこの、

public class StackApp extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 

     SharedPrefsManager.init(this); 
    } 
} 

のように初期化することができ、このようなアプリケーションクラスから

public class SharedPrefsManager { 
    private static SharedPrefsManager mInstance= null; 
    private SharedPreferences sharedPreferences; 
    private SharedPreferences.Editor prefsEditor; 

    private SharedPrefsManager(Context context) { 
     sharedPreferences = context.getSharedPreferences(context.getPackageName(), Activity.MODE_PRIVATE); 
     prefsEditor = sharedPreferences.edit(); 
    } 

    public static void init(Context context) { 
     mInstance = new SharedPrefsManager(context); 

    } 


    public static SharedPrefsManager getInstance() { 
     if (mInstance == null) { 
      throw new RuntimeException(
        "Must run init(Application application) before an instance can be obtained"); 
     } 
     return mInstance; 
    } 

    /** 
    * To get the Stored string value in Preference. 
    * 
    * @param key 
    * @param defaultvalue 
    * @return stored string value. 
    */ 
    public String getStringValue(final String key, final String defaultvalue) { 
     return sharedPreferences.getString(key, defaultvalue); 
    } 

    /** 
    * To store the string value in prefernce. 
    * 
    * @param key 
    * @param value 
    */ 
    public void setStringValue(final String key, final String value) { 
     prefsEditor.putString(key, value); 
     prefsEditor.commit(); 
    } 
} 

を作成して任意の場所に

からアクセスできるようにします。 例:あなたはこのように使用することができ、

SharedPrefsManager.getInstance().setStringValue("key", "value"); 
+0

downvoteの理由を知り得ますか? –

+0

私はdownvoteをしませんでしたが、答えはあなたがシングルトンのポイントであるgetInstanceを使用していないために悪いです:D – Vucko

+0

私はクラスを初期化しました。 setstring( "key"、 "value"); **私が与えた例の主な目的は** –

0

設定がContext自体

関連する問題