0

私はこれについて混乱しています。android を開始したばかりで、オブジェクトをまとめるために複数のアクティビティを必要とする長いフォームがあります。オブジェクトをアクティビティからアクティビティに渡してビルドしたいと思います。多くの投稿やブログ、Android Dev ページを読んだ後、非永続データのようです。最善の策は、アプリケーションをサブクラス化するか、シングルトンを作成することです。この投稿openFileOutput がシングルトン クラス内で適切に機能しないことを確認しました - アイデア/回避策? そして今、私の質問はこれです.シングルトンがリサイクルされないのはなぜですか? アクティビティ A で createSingleton() を実行してからアクティビティ B に移動し、シングルトンへの参照を渡さない場合、ガベージ リサイクラーは、再びシングルトンに戻ることをどのように認識しますか? アクティビティAがリサイクルされ、アクティビティBに移動すると、シングルトンが死ぬように思えます..

次のシングルトンを見ると..

public final class SomeSingleton implements Cloneable {

    private static final String TAG = "SomeSingleton";
    private static SomeSingleton someSingleton ;
    private static Context mContext;    

    /**
     * I'm private because I'm a singleton, call getInstance()
     * @param context
     */
    private SomeSingleton(){
        // Empty
    }

    public static synchronized SomeSingleton getInstance(Context context){
        if(someSingleton == null){
        someSingleton = new SomeSingleton();
        }
    mContext = context.getApplicationContext();
    return someSingleton;
    }

    public void playSomething(){
        // Do whatever
        mContext.openFileOutput("somefile", MODE_PRIVATE); // etc...
    }

    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("I'm a singleton!");
    }
}

そして、getInstance() を介してそのインスタンスを作成します。クラスは、クラスの単一のインスタンスを静的フィールド someSingleton に配置します。このインスタンスがリサイクルされないのはなぜですか? 答えが「静的フィールドは決してリサイクルされないのですか?」メモリがたくさんある場合、メモリをすべて使い切らないのはなぜですか? シンプルなデザインの考慮事項?提供された多くのライブラリを使用している場合、静的フィールドがいくつあるかわからない場合、これは危険に思えます。私は初心者としてOOPに欠けているいくつかの基本的なルールがあると感じています。

4

2 に答える 2

1

一般的なパターンは、静的フィールドにシングルトン クラスへの参照を配置することです。静的フィールドは特定のインスタンスに関連付けられていないため、JVM プロセスが有効になるまで保持されます。アクセスするアクティビティの数は重要ではありません。シングルトンを「リサイクル」する必要がある場合、本当にシングルトンを使用する必要はないのでしょうか? または、明示的なclose()/open()メソッドなどを提供します。

于 2012-04-25T02:34:47.087 に答える
0

シングルトンがリサイクルされない理由は、Android のアクティビティが破棄されていると思っても破棄されないためだと思います。

あなたは、「アクティビティ A から B に移動するとどうなるか」というような質問を投げかけます。しかし、Android でそれを行うと、Activity A が破棄されることはほとんどありません。通常、onPause()状態になるだけです。したがって、ユーザーがアクティビティ A に戻るのに十分な回数戻るボタンを押した場合でも、アクティビティ A は (ほとんど) 無傷のままです。

于 2012-04-25T16:36:48.903 に答える