AsyncTask 内部类

AsyncTask这个类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的,因此如果AsyncTask作为Activity的内部类,就更容易出现内存泄露的问题。这个问题的解决办法小马当时网上查到了记在txt里了,如下: 
6.1:将线程的内部类,改为静态内部类。
6.2:在线程内部采用弱引用保存Context引用

示例代码如下:

 
  
  
  1. public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends 
  2.             AsyncTask<Params, Progress, Result> { 
  3.         protected WeakReference<WeakTarget> mTarget;   
  4.  
  5.         public WeakAsyncTask(WeakTarget target) { 
  6.             mTarget = new WeakReference<WeakTarget>(target); 
  7.         }   
  8.  
  9.         /** {@inheritDoc} */ 
  10.         @Override 
  11.         protected final void onPreExecute() { 
  12.             final WeakTarget target = mTarget.get(); 
  13.             if (target != null) { 
  14.                 this.onPreExecute(target); 
  15.             } 
  16.         }   
  17.  
  18.         /** {@inheritDoc} */ 
  19.         @Override 
  20.         protected final Result doInBackground=\'#\'" /span>
  21.             final WeakTarget target = mTarget.get(); 
  22.             if (target != null) { 
  23.                 return this.doInBackground=\'#\'" /span>
  24.             } else { 
  25.                 return null
  26.             } 
  27.         }   
  28.  
  29.         /** {@inheritDoc} */ 
  30.         @Override 
  31.         protected final void onPostExecute(Result result) { 
  32.             final WeakTarget target = mTarget.get(); 
  33.             if (target != null) { 
  34.                 this.onPostExecute(target, result); 
  35.             } 
  36.         }   
  37.  
  38.         protected void onPreExecute(WeakTarget target) { 
  39.             // No default action 
  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