Java の質問: 外部クラスがあり、そのメソッドが匿名の内部クラスを生成しています。匿名の内部クラスは、外部クラスのインスタンスよりも長く存続できます。匿名の内部クラスは、外部クラスからの何も使用しません。生成された内部クラスは依然として外部クラスへの参照を保持し、GC を妨げますか?
Android の質問:
public class SomeActivity... {
public void onResume(){
....
asyncTask.setCallback(newCallback());
}
private static Callable newCallback(){
return new Callable()......;
}
}
次に、メソッド newCallback() について説明します。静的でなければ...
callable を実装する新しい匿名クラスを作成すると、外部クラス (現在のコンテキスト、Activity) への暗黙的な参照を持つことができます。非同期タスクは Android のコンテキストにバインドされていないため、Activity よりも長く存続できます。そのメンバー (コールバック呼び出し可能オブジェクト) もそうです。呼び出し可能オブジェクトはアクティビティへの暗黙的な参照を持つことができるため、コンテキスト (アクティビティ) を GC で使用できなくなり、メモリ リークを見つけるのが困難になる可能性があります。
私の質問は次のとおりです: newCallback メソッドが静的でない場合、作成されたコールバックは外部クラスへの参照を保持しますか? 静的メソッドで callable の生成を外部化することを覚えている弾丸をかわしただけなので、アクティビティへの暗黙的な参照は保持されませんか?