2011-01-28 6 views
43

私は現在、チーム内にいくつかのAndroidアプリを開発しており、最後の2ヶ月間に2種類のアプローチを使用しています(私が個人的に好むものと他の開発者が好むもの)。Android:AsyncTaskおすすめ:プライベートクラスまたはパブリッククラス?

これまでの結果は同じですが、これは我々が...すべき不思議私を得た:それらを使用する活動内部プライベートクラスなど

  • 使用AsyncTasksを。
  • や活動

のコンテキストを受ける別のパブリッククラスとしてAsyncTasksを使用するには、Googleが推奨するapproachsのいずれかいますか?

これについてのあなたの経験は何ですか(利点、欠点、問題)?

答えて

35

内部クラスは、プライベートであるか、何らかの形で密接に囲まれているクラスに関連付けられているオブジェクトを表すのに適しています。時折、内部クラスを使用する技術的な理由がある(例えば、クロージャをシミュレートする)。彼らはまた、名前空間の汚染を減らしました。

内部クラスの1つの欠点は、それらが囲むクラスのプライベートメンバー(フィールドまたは関数)にアクセスする場合、コンパイラはそれらのメンバーへのアクセサ関数を生成することです。言語の純粋主義者は、この封じ込めの破れが良いものか悪いものかを主張する。アクセス機能は、各アクセスにオーバーヘッドのビットを追加します(通常は要素ではありませんが、そこにあります)。別の欠点は、ソースファイルをより複雑にして管理することが難しくなることです。なぜなら、内部クラスは再利用できない傾向がありますが、別のクラスはしばしば複数の用途を持つようにパラメータ化されることがあります(つまり、内部クラスの関数を外部クラスにあると考えて編集することによって時々突き刺されました。 。

これらの長所と短所は私の頭の上から外れています。私は他の人にも考えがあることを確信しています。

UPDATE:このGoogle IO video

インナーAsyncTaskオプションは明らかに間違っオプションとしてマークされています。

+1

しばらくして、それらを別々のパブリッククラスとして使用すると、はるかに役立つことがわかります。 – neteinstein

+14

@NeTeInStEiN - AsyncTaskの場合、内部クラス(ネストされた静的クラスと比較して)は技術的な理由から常に間違っています。AsyncTaskを停止することなくアクティビティを強制的に無効にすることができます。 AsyncTaskが内部クラスの場合、AsyncTaskは外部クラスインスタンスへの(隠れた)参照を持つため、これは古いActivityをリークします。電話機の向きを少し変更すると、メモリが枯渇してプロセスが停止する可能性があります。 –

7

あなたのコードに最も合ったものを使用してください。重要なことは、アクティビティが暗黙的にアクティビティの内部クラスとして破棄された後、またはアクティビティ/コンテキストオブジェクトが与えられて明示的にアクティビティの参照を保持している非同期タスクを監視することです。

+4

アクティビティへの参照を保持するAsyncTaskの(非常に一般的な)問題の解決方法については、[このディスカッション](https://groups.google.com/forum/#!starred/android-developers/vwRrlc84gy0)を参照してください。 –

関連する問題