参见:http://blog.chinaunix.net/space.php?uid=20787846&do=blog&cuid=2289102

http://winuxxan.blog.51cto.com/2779763/512179

有些人喜欢用Android提供的AsyncTask,但事实上AsyncTask的问题更加严重,Thread只有在run函数不结束时才出现这种内存泄露问题,然而AsyncTask内部的实现机制是运用了ThreadPoolExcutor,该类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的,因此如果AsyncTask作为Activity的内部类,就更容易出现内存泄露的问题。

这种线程导致的内存泄露问题应该如何解决呢?

第一、将线程的内部类,改为静态内部类。

第二、在线程内部采用弱引用保存Context引用。

解决的模型如下:

        
  1. publicabstractclassWeakAsyncTask<Params,Progress,Result,WeakTarget>extends
  2. AsyncTask<Params,Progress,Result>{
  3. protectedWeakReference<WeakTarget>mTarget;
  4. publicWeakAsyncTask(WeakTargettarget){
  5. mTarget=newWeakReference<WeakTarget>(target);
  6. }
  7. /**{@inheritDoc}*/
  8. @Override
  9. protectedfinalvoidonPreExecute(){
  10. finalWeakTargettarget=mTarget.get();
  11. if(target!=null){
  12. this.onPreExecute(target);
  13. }
  14. }
  15. /**{@inheritDoc}*/
  16. @Override
  17. protectedfinalResultdoInBackground(Params...params){
  18. finalWeakTargettarget=mTarget.get();
  19. if(target!=null){
  20. returnthis.doInBackground(target,params);
  21. }else{
  22. returnnull;
  23. }
  24. }
  25. /**{@inheritDoc}*/
  26. @Override
  27. protectedfinalvoidonPostExecute(Resultresult){
  28. finalWeakTargettarget=mTarget.get();
  29. if(target!=null){
  30. this.onPostExecute(target,result);
  31. }
  32. }
  33. protectedvoidonPreExecute(WeakTargettarget){
  34. //Nodefaultaction
  35. }
  36. protectedabstractResultdoInBackground(WeakTargettarget,Params...params);
  37. protectedvoidonPostExecute(WeakTargettarget,Resultresult){
  38. //Nodefaultaction
  39. }
  40. }


更多相关文章

  1. Android中工作线程与主线程同步方式
  2. Android 关闭线程(转)
  3. Android 多线程2
  4. Android内存管理与申请
  5. android系统信息,cpu、内存、电池等
  6. Android 开发 Eclipse 内存调整
  7. Android在子线程中更新UI(二)
  8. Android在子线程中更新UI(一)

随机推荐

  1. Android(安卓)Studio 引入编写好的.so库
  2. [安卓基础] 001.学习Android开发的好教程
  3. android平台上的文件下载,文件和文件的操
  4. 关于Android如何改变ProgressBar进度条颜
  5. Android Talker(3)Go on with the REST S
  6. Android 日期和时间选择控件的开发
  7. 利用 nodejs 自动生成 Android 语言包实
  8. 一步步教你用Android(安卓)Google Map(一)
  9. Android之父安迪·鲁宾:极客文化的代表
  10. 修改 Android 开机 LOGO