8

Androidアプリの開発中に、静的クラスに入れたユーティリティタイプのメソッドのコレクションにたどり着きました。これらのメソッドはすべて複数のアクティビティで使用され、それらのほとんどは呼び出し元のアクティビティからの情報を必要としません。

ただし、アクティビティのコンテキストを必要とするメソッドと、アクティビティ自体を必要とするメソッドがいくつかあります。それらのいくつかを例示させてください:

  • getDeviceNaturalOrientation()-アクティビティのgetWindow()。getWindowManager()。getDefaultDisplay()を使用して、ディスプレイの回転、幅、高さにアクセスし、デバイスの自然な向きを決定します。
  • getDeviceOrientation()-上記と同様ですが、現在の向きを取得します
  • createFile()-コンテキストを使用して、いくつかのリソース(文字列)にアクセスし、いくつかのトーストを作成して表示します

さて、このUtilsクラスに関する私の大きな質問は次のとおりです。

  1. これまでのところ、各関数は、私が行っているアクティビティから渡すContextパラメータを取りますが、Utilsクラスで静的なContextまたはActivity変数を作成し、各アクティビティの先頭に設定することは問題ありません(onCreateのように) )?この変数は、ContextまたはActivityインスタンスを必要とする関数で使用されます。
  2. 上記が推奨されていないと仮定して、Activityパラメーターをメソッドに渡しても大丈夫ですか、それともActivityをContextとしてのみ渡す理由がありますか?上記のデバイスオリエンテーション関数に使用するメソッドは、コンテキストではなくアクティビティオブジェクトに固有であるため、アクティビティとして渡すか、コンテキストとして渡してアクティビティにキャストします(後者はひどい考えのように聞こえます)。

また、このUtilクラスは、Context / Activityを必要とするこれらのメソッドを実行する方法ではない可能性があるという考えに非常にオープンです。したがって、これらのメソッドを使用する各アクティビティクラスにこれらのメソッドのコピーが存在しないようにする代替案を歓迎します。 。

4

3 に答える 3

4

1)コンテキストへの静的リンクは、メモリリークを引き起こす可能性があります。これは、アクティビティへの参照が破棄された後も静的変数に保持されることを意味します。そのため、アクティビティのすべてのメモリとそのすべてのビューは有効なままであり、gcによってクリーンアップされません。これは可能ですが、完了したら変数をnullにするように注意する必要があります。それを避けるだけの方がいいです。

2)アクティビティをアクティビティとして渡すのは少し厄介ですが、技術的な理由はありません。その時点で、コードのクリーン性/保守性について議論しています。また、クリーンでないソリューションの方が簡単な場合もあります。もちろん、上記の場合は、コンテキスト全体を渡すか、特別なアクセサーを作成するよりも、orientation / display/Resourcesオブジェクトを関数に渡します。

于 2013-03-27T04:36:44.597 に答える
0

アクティビティから電話するときは、次のデザインで問題ないと思います

MyUtility utility=new MyUtility();
utility.getDeviceNaturalOrientation(this);
utility.getFile(this);

そして、これらの関数を次のように定義できます

public int getDeviceNaturalOrientation(Activity activity){
 //code
return some_oreientation
}

そしてこのように

public File getFile(Context context){
 //code
//return file handler
}

アクティビティはコンテキストのサブクラスであるため、デザインを次のように変更することもできます

MyUtility utility=new MyUtility(this); //this refer to Activity
utility.getDeviceNaturalOrientation();
utility.getFile();

アクティビティに合格する限り問題ありませんが、アクティビティをフォローすると、最初のメソッド呼び出しでエラーが発生します。

MyUtility utility=new MyUtility(getApplicationContext());
utility.getDeviceNaturalOrientation(); //will throw exception
utility.getFile();

そして、はい、最初のアイデアは推奨される方法ではありません。

于 2013-03-27T04:53:50.877 に答える
0

WeakReference of your ActivityまたはgetApplicationContext()(それを使用して動作できる作品の場合)を送信し、メモリリークが発生static methodするため使用しないことをお勧めします。開発者ブログも読む

于 2015-03-12T09:01:41.193 に答える