web-dev-qa-db-ja.com

Androidでの静的変数の使用

Androidでは、静的変数を使用することをお勧めしますか?たとえば、Javaでシングルトンパターンを実装する場合、通常は次のことを行います。

private static A the_instance;
public static A getInstance() {
    if (the_instance == null) {
       the_instance = new A();
    }
    return the_instance;
}

また、これはAndroid JVMによってクリーンアップされるのはいつですか?

ありがとうございました。

55
michael

staticフィールドは、全体としてClassインスタンスにアタッチされ、次にクラスをロードしたClassLoaderにアタッチされます。 the_instanceは、ClassLoader全体が回収されるときにアンロードされます。 Androidアプリがバックグラウンドになったときや一時停止したときではなく、完全にシャットダウンされたときではなく)

そのため、アプリが実行されている限り生き続けると考えてください。シングルトンは良いアイデアですか?人々は異なる見解を持っています。自分で適切に使用すれば大丈夫だと思います。 Androidで答えが大きく変わるとは思わない。メモリ使用量自体は問題ではありません。メモリに大量のものをロードする必要がある場合、シングルトンでデータをカプセル化するかどうかに関係なく、それは問題であるかそうでないかのどちらかです。

63
Sean Owen

静的変数は問題ないと思います。

これはAndroid docが言うことです:

http://developer.Android.com/guide/appendix/faq/framework.html

単一のアプリケーション内のアクティビティ/サービス間でデータを渡すにはどうすればよいですか?

パブリック静的フィールド/メソッド

アクティビティ/サービス間でデータにアクセスできるようにする別の方法は、パブリック静的フィールドやメソッドを使用することです。これらの静的フィールドには、アプリケーションの他のクラスからアクセスできます。オブジェクトを共有するために、オブジェクトを作成するアクティビティは、このオブジェクトを指す静的フィールドを設定し、このオブジェクトを使用する他のアクティビティは、この静的フィールドにアクセスするだけです。

15
user256239

使用可能なメモリが限られているモバイルプラットフォームにこのようなアプローチが適しているかどうかはわかりません。アプリケーションがマルチタスク対応デバイスで実行されることは言うまでもありません。

このアプローチはデバイスからメモリを食い尽くすかもしれませんが、これをサポートするドキュメントはありません。おそらく私よりも教育を受けた人が考えを共有できるでしょう。

0
RobGThai

他の人の言うことに反して-それは大丈夫です。確かに、それには何らかの構造があります。公式のgooglesamples/Android-architectureリポジトリでは、todo-mvp-clean(MVPパターンを実装し、Clean Architectureの原則に従うTodoアプリ)の下で使用されます。これを確認してください file

表示されるのは、シングルトンゲッターを参照する多くの静的メソッドです。

最新でエラーが少なく便利な代替手段は、Dagger DIフレームワークです。

0
Mikel