AsyncTaskクラスによって生成されたThreadオブジェクトのライフサイクルは不確実であり、アプリケーションで制御することはできません。したがって、AsyncTaskをActivityの内部クラスとして使用すると、メモリリークが発生しやすくなります。この問題の解決策は、Xiao Maによってインターネット上で発見され、次のようにtxtに記録されました。6.1:
スレッドの内部クラスを静的内部クラスに変更します。
6.2:弱い参照を使用して、スレッド内にコンテキスト参照を保存します
スレッドの内部クラスを静的内部クラスに変更します。
6.2:弱い参照を使用して、スレッド内にコンテキスト参照を保存します
サンプルコードは次のとおりです。
- パブリック 抽象 クラス WeakAsyncTask <Params、Progress、Result、WeakTarget> は拡張します
- AsyncTask <Params、Progress、Result> {
- 保護された WeakReference <WeakTarget> mTarget;
- public WeakAsyncTask(WeakTarget target){
- mTarget = new WeakReference <WeakTarget>(target);
- }
- / ** {@inheritDoc} * /
- @オーバーライド
- 保護された 最終的な 空隙 onPreExecute(){
- 最終的な WeakTargetターゲット= mTarget.get();
- if (target!= null){
- this .onPreExecute(target);
- }
- }
- / ** {@inheritDoc} * /
- @オーバーライド
- 保護された 最終 結果doInBackground = \ '#\' "/ span>
- 最終的な WeakTargetターゲット= mTarget.get();
- if (target!= null){
- この.doInBackground = \ '#\' "/ span>を返します
- } else {
- nullを返す;
- }
- }
- / ** {@inheritDoc} * /
- @オーバーライド
- protected final void onPostExecute(Result result){
- 最終的な WeakTargetターゲット= mTarget.get();
- if (target!= null){
- this .onPostExecute(target、result);
- }
- }
- protected void onPreExecute(WeakTarget target){
- //デフォルトのアクションはありません
- }
- protected abstract Result doInBackground(WeakTarget target, Params... params);
- protected void onPostExecute(WeakTarget target, Result result) {
- // No default action
- }
- }
public abstract class WeakReferenceHandler<T> extends Handler {
private WeakReference<T> mReference;
public WeakReferenceHandler(T reference) {
mReference = new WeakReference<T>(reference);
}
@Override
public void handleMessage(Message msg) {
if (mReference.get() == null)
return;
handleMessage(mReference.get(), msg);
}
protected abstract void handleMessage(T reference, Message msg);
}