3

私はAndroidアプリを持っており、そこではいくつかのアクティビティがあります。各アクティビティは、xml / jsonフィードをダウンロードして解析し、通常はアレイリストとしてシングルトンにプッシュします。

ただし、さまざまなアクティビティを実行した後、シングルトンが停止しているようで、以前にダウンロードしたアレイリストのほとんどが空になっています。なんでそうなの?シングルトンは、アクティビティ間でデータを共有するための推奨プラクティスではありませんか?

4

3 に答える 3

3

私のコメントを回答として追加する

アクティビティ全体でグローバル変数を保持する場合は、それをアプリケーションに保持します。アプリケーションからクラスを拡張し、それを AndroidManifest ファイルに追加します。

@rekaszeru が共有する Android API FAQ から

シングルトン クラス

シングルトンを使用すると、アプリケーション コンポーネントが同じプロセスで実行されるという事実を利用できます。これは、インスタンスを 1 つだけ持つように設計されたクラスです。インスタンスを返す getInstance() などの名前の静的メソッドがあります。このメソッドが初めて呼び出されたときに、グローバル インスタンスが作成されます。すべての呼び出し元が同じインスタンスを取得するため、これを対話のポイントとして使用できます。たとえば、アクティビティ A はインスタンスを取得して setValue(3) を呼び出します。後でアクティビティ B がインスタンスを取得し、getValue() を呼び出して、最後に設定された値を取得する場合があります。

于 2012-05-16T17:10:02.560 に答える
2

Android API FAQのこのスレッドを参照してください。ここでは、問題に最も適切な解決策が確実に見つかります(短命または長寿命のデータが必要かどうかにかかわらず)。

シングルトンは、ライフサイクルの短いオブジェクトに使用されます。

編集:大量のデータについては、データベース/構造化されたローカルファイルを使用することをお勧めします(後者は読み取り/書き込みにリソースを消費しますが)。また、非常に複雑なオブジェクトを使用している場合は、選択SharedPreferencesすると頭痛の種になる可能性もあります。

リストの保存/ロードのサンプルSharedPreferences

// the name with which to store the shared preference
public static final String PERSON_LIST = "my.personlist";

// a sample data structure that will be stored
public static final class Person
{
    private String name;
    private int age;

    public String toString() 
    {
        return name + "|" + age;
    }

    // splits the passed String parameter, and retrieves the members
    public static Person loadPersonFromString(final String personString)
    {
        final Person p = new Person();
        final String[] data = personString.split("|");
        p.name = data[0];
        p.age = Integer.parseInt(data[1]);
        return p;
    }
}

/**
 * Saves the current list of Persons in SharedPreferences 
 * @param persons: the list to save
 */
public void savePersonList(final ArrayList<Person> persons) 
{
    final SharedPreferences prefs = PreferenceManager.
        getDefaultSharedPreferences(getApplicationContext());
    final Editor editor = prefs.edit();
    final StringBuilder builder = new StringBuilder();
    for (final Person person : persons)
    {
        if (builder.length() > 0)
            builder.append("-Person-");
        builder.append(person.toString());
    }
    editor.putString(PERSON_LIST, builder.toString());
    editor.commit();
}

/**
 * Loads the list of Persons from SharedPreferences
 * @return the loaded list
 */
public ArrayList<Person> loadPersonList()
{
    final SharedPreferences prefs = PreferenceManager.
        getDefaultSharedPreferences(getApplicationContext());
    final ArrayList<Person> persons = new ArrayList<Menu.Person>();
    final String[] array = prefs.getString(PERSON_LIST, "").split("-Person-");
    for (final String personString : array) 
    {
        if (personString.length() > 0)
            persons.add(Person.loadPersonFromString(personString));
    }
    return persons;
}
于 2012-05-16T17:03:21.927 に答える
1

Application クラスを介して初期化する場合があります。このクラスは、すべてのアクティビティに存在します。これはマニフェスト ファイルで宣言する必要があり、アクティビティと同様のライフサイクルがあります。

ドキュメントはこちら:アプリケーション

それが役に立てば幸い。

JQコレイア

于 2012-05-16T17:00:20.457 に答える