AsyncTask内部クラス

AsyncTaskクラスによって生成されたThreadオブジェクトのライフサイクルは不確実であり、アプリケーションで制御することはできません。したがって、AsyncTaskをActivityの内部クラスとして使用すると、メモリリークが発生しやすくなります。この問題の解決策は、Xiao Maによってインターネット上で発見され、次のようにtxtに記録されました。6.1: 
スレッドの内部クラスを静的内部クラスに変更します。
6.2:弱い参照を使用して、スレッド内にコンテキスト参照を保存します

サンプルコードは次のとおりです。

 
  
  
  1. パブリック 抽象 クラス WeakAsyncTask <Params、Progress、Result、WeakTarget> は拡張します 
  2.             AsyncTask <Params、Progress、Result> { 
  3.         保護された WeakReference <WeakTarget> mTarget;   
  4.  
  5.         public  WeakAsyncTask(WeakTarget target){ 
  6.             mTarget =  new  WeakReference <WeakTarget>(target); 
  7.         }   
  8.  
  9.         / ** {@inheritDoc} * / 
  10.         @オーバーライド 
  11.         保護された 最終的な 空隙 onPreExecute(){ 
  12.             最終的な WeakTargetターゲット= mTarget.get(); 
  13.             if  (target!=  null){ 
  14.                 this .onPreExecute(target); 
  15.             } 
  16.         }   
  17.  
  18.         / ** {@inheritDoc} * / 
  19.         @オーバーライド 
  20.         保護された 最終 結果doInBackground = \ '#\' "/ span>
  21.             最終的な WeakTargetターゲット= mTarget.get(); 
  22.             if  (target!=  null){ 
  23.                  この.doInBackground = \ '#\' "/ span>を返します
  24.             }  else  { 
  25.                  nullを返す
  26.             } 
  27.         }   
  28.  
  29.         / ** {@inheritDoc} * / 
  30.         @オーバーライド 
  31.         protected  final  void  onPostExecute(Result result){ 
  32.             最終的な WeakTargetターゲット= mTarget.get(); 
  33.             if  (target!=  null){ 
  34.                 this .onPostExecute(target、result); 
  35.             } 
  36.         }   
  37.  
  38.         protected  void  onPreExecute(WeakTarget target){ 
  39.             //デフォルトのアクションはありません 
  40.         }   
  41.  
  42.         protected abstract Result doInBackground(WeakTarget target, Params... params);   
  43.  
  44.         protected void onPostExecute(WeakTarget target, Result result) { 
  45.             // No default action 
  46.         } 
  47.  
  1.     } 
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);
}
 


おすすめ

転載: blog.csdn.net/fuweiping/article/details/19030275