2.26学习笔记 android事件分发,handler内存泄露

来源:互联网 发布:电子书数据库 编辑:程序博客网 时间:2024/05/22 14:54

http://blog.csdn.net/jxxfzgy/article/details/43926987

这里写图片描述

这里写图片描述



handler内存泄露

http://blog.csdn.net/allen315410/article/details/43638423

原因:

在Java中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用。静态的内部类不会持有外部类的引用。

handler以内部类出现在activity时,如果activity已经finish,但handler很久都没有运行完,系统回收activity时包内存溢出错误,runnable也会出现该问题
出现代码:
  1. public class SampleActivity extends Activity {  
  2.    
  3.   private final Handler mLeakyHandler = new Handler() {  
  4.     @Override  
  5.     public void handleMessage(Message msg) {  
  6.       // ...  
  7.     }  
  8.   }  
  9.    
  10.   @Override  
  11.   protected void onCreate(Bundle savedInstanceState) {  
  12.     super.onCreate(savedInstanceState);  
  13.    
  14.     // Post a message and delay its execution for 10 minutes.  
  15.     mLeakyHandler.postDelayed(new Runnable() {  
  16.       @Override  
  17.       public void run() { /* ... */ }  
  18.     }, 1000 * 60 * 10);  
  19.    
  20.     // Go back to the previous Activity.  
  21.     finish();  
  22.   }  
  23. }  

如何避免:
  1. private static class MyHandler extends Handler {  
  2.     private final WeakReference<SampleActivity> mActivity;  
  3.   
  4.     public MyHandler(SampleActivity activity) {  
  5.       mActivity = new WeakReference<SampleActivity>(activity);  
  6.     }  
  7.   
  8.     @Override  
  9.     public void handleMessage(Message msg) {  
  10.       SampleActivity activity = mActivity.get();  
  11.       if (activity != null) {  
  12.         // ...  
  13.       }  
  14.     }  
  15.   }  

  1. private static final Runnable sRunnable = new Runnable() {  
  2.       @Override  
  3.       public void run() { /* ... */ }  
  4.   };  






0 0
原创粉丝点击