[セットトップ]android内の単一のオブジェクトといくつかのデータが解放される問題

3547 ワード

正式なandroid開発に接触してからしばらく経ち、プロジェクトの最初のバージョンがやっと完成しました.ある時、自分がテストしている間に、自分のandroidプロジェクトをバックグラウンドにカットし、同時にいくつかのアプリケーションを開いてから自分のappに戻し、新聞が間違っていることに気づいた.調べたところ,自分の単例オブジェクトのデータが解放された,すなわちint変数の値が0になり,string変数の値がnullになったことが分かった.
私の単例は最初はこのようなものでした(例).
    
public class UserInfo {
	private static UserInfo userInfo = null;
	
	private int level;
	
	private UserInfo() {  
		
    <span style="white-space:pre">	</span>}
	
	public static UserInfo getInstance() {
		if (null == userInfo) {
			userInfo = new UserInfo();
		}
		return userInfo;
	}
	
	public void setLevel(int level){
		this.level = level;
	}
	
	public int getLevel(){
		return level;
	}
}

これは、私たちがよく使用する変数を格納するための比較的一般的な単一のクラスであるべきです.通常、私の使用は問題ありません.各activity、fragmentでは、次のコードクリップのように正常に使用できます.
if(UserInfo.getInstance().getLevel() == 3){
	//      
}

しかし、私が私のテスト機(テスト機は512 mメモリ)を使ってテストを行ったとき、まずandroidアプリケーションをバックグラウンドに切り、qqなどの他のappを複数開き、私たちのアプリケーションをフロントに復元したとき、上記の例のコードブロックが入らなかったので、印刷デバッグでgetLevel()の値が0になったこと、つまり解放されたことがわかりました.Googleで調べてみると、androidで私のような単例を使っても大丈夫な人もいれば、自分の単例が解放されたと言っている人もいます.つまり、私の場合と同じです.携帯電話のメモリが不足しているためか、単一のオブジェクトに格納されているデータが解放されました.
次はこの問題の解決方法を見つけなければならない.
(1)androidアプリケーションを使うという方法は本来使いたいと思っていたのですが、大体調べてみました.例えばこの文章:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0204/2409.html
この方法を使わないほうがいいことに気づいて、文章に書いても単例を使わないでください~~自分でやってみましたが、問題は依然として存在しているような気がします.
(2)onSaveInstanceState()とonRestoreInstanceState()は、この問題が発生した場合、androidが現在のactivityを強制的に削除し、単一のオブジェクトのデータを同時に解放した可能性があります.私も確かにonSaveInstanceState()関数を実行し、同時に切り取ったときにonRestoreInstanceState()を実行してactivityを再描画すると、onSaveInstanceState()に私の単例データを格納し、onRestoreInstanceState()に私のデータを再割り当てすることができます.これでもいいようですが、これでは、単例ではあまりにも、単例は必要ないような気がします.
(3)SharedPreferencesを使用してデータへのアクセス操作を行い、データに値を付けて取り出す場合は、次のコードを使用します.
<span style="white-space:pre">	</span>public void setLevel(int level, Context context){
		saveSharedPreferences(context, "level", level+"");
		this.level = level;
	}
	
	public int getLevel(Context context){
		level = Integer.parseInt(Utils.readSharedPreferences(context, "level"));
		return level;
	}
<span style="white-space:pre">	</span>public static void saveSharedPreferences(Context context, String name, String data) {
		SharedPreferences sharedPreferences = context.getSharedPreferences("school_user_info", Context.MODE_PRIVATE);
		SharedPreferences.Editor editor = sharedPreferences.edit();
		editor.putString(name, data);
		editor.commit();
	}

	public static String readSharedPreferences(Context context, String name) {
		SharedPreferences sharedPreferences = context.getSharedPreferences("school_user_info", Context.MODE_MULTI_PROCESS);
		return sharedPreferences.getString(name, "");
	}

単例オブジェクトのデータに値を付与する場合、このデータをpreferenceに格納し、使用する場合、preferenceから私の値を取り出し、対応する操作を行います.そうすると、私の単例が解放されても、preferenceからデータを取り出すことができます.そうすると、自分の前のバグが消えてしまい、データが空であるため様々なエラーが発生することはありません.
しかし、よく考えてみると、このようにすると単例モードがここで使うのは少し余計で、preferenceに直接アクセスすればいいのに、どうしてそんなことを書くのですか.プロジェクトの進度が緊迫しているため、私は(3)方法で私のコードを修正してこのようなバグがないことを保証するしかありませんが、このようにして私の今の目から見ると、とてもよくなくて、コードの余計な感じがします.しかし、単例モードは私たちの仕事の中で最もよく使われる設計モードで、学校の时に私たちはよくそれを使っていますが、androidではこのように単例を使うことができませんか?私はこれに対して懐疑的な態度を持っている.
皆さんは私と同じ問題に遭遇したかどうか分かりませんが、もし出会ったら、どうやって解決しましたか?どのようにandroidで単例モードを使用しますか?良い方法の学友が自分の見方を分かち合うことができることを望みます~