2010-11-18 9 views
10

このarticleを正しく解釈すると、アクティビティコンテキストをAsyncTasksに渡すと、タスクが実行中にアクティビティが破棄される可能性があります。AsyncTaskのAndroidコンテキストリーク

AsyncTasksで、内部クラッシュではなくリソースへのアクセスやUIの更新が必要な場合はどうすれば対処できますか?

また、進行状況ダイアログを参照してコンテキストを解除する必要がある場合、どのようにしてコンテキストが漏洩するのを防ぐことができますか?

+0

[this](http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is-there-any-100-working/3821998#3821998)をご覧ください。オリエンテーションの変更についてですが、これはアクティビティ/コンテキストへの参照をしっかりと保持することを扱っています。 –

答えて

11

あなたの質問が正しく理解されている場合:JavaのWeakReferenceまたはSoftReferenceクラスは、このような状況に適しています。必要に応じてGCがコンテキストを解放することを防ぐことなく、コンテキストをAsyncTaskに渡すことができます。

WeakReferenceを収集するとき、GCはSoftReferencesを収集するときよりも熱心です。

の代わり:

WeakReference<MyContextClass> myWeakContext = new WeakReference<MyContextClass>(myContext); 
FooTask myFooTask = new FooTask(myWeakContext); 

とAsyncTaskではなく、::

FooTask myFooTask = new FooTask(myContext); 

あなたのコードは次のようになり

myContext.someMethod(); 

あなたのコードは次のようになります。

myWeakContext.get().someMethod(); 
+4

myWeakContext.get()がnullを返さないようにしてください。 –

+0

これは、タスクが完了した後でUI更新を厳密に行う必要がない場合に機能します。アクティビティが再作成された後で非同期タスクの結果が必要な場合は、別の方法を使用する必要があります。状態を保持するように設定されたヘッドレスフラグメントは、タスクを管理できます。 – r1k0