Android 内存泄露之------Thread

本文详细解析了线程泄露的成因,并提出了两种有效解决方案:将非静态内部类改为静态内部类,以及在线程内部采用弱引用保存Context引用,避免内存泄露问题。

一. Thread泄露

使用Thread 要格外小心,它内存泄露的主要原因是Thread保存着外部类的应用,导致Thread在没有释放的时候会一直抓着外部类的引用不放进而使外部类得不到释放,造成内存泄露。比如下面的例子就会造成Activity在thread运行时得不到释放,极端的例子就是一直 横竖屏切换,很容易就outofmemory了。

  1. public class ThreadActivity extends Activity {  
  2.     public void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.activity_main);  
  5.         new MyThread().start();  
  6.     }  
  7.   
  8.     private class MyThread extends Thread {  
  9.         @Override  
  10.         public void run() {  
  11.             super.run();  
  12.             dosomthing();  
  13.         }  
  14.     }  
  15.     private void dosomthing(){  
  16.       
  17.     }  
  18. }  
对此解决办法是

1.把非静态内部类改为静态的内部类,因为静态的内部类(嵌套类 inner activty )可以不依赖与外部类所以它不会持有外部类的引用。

2.如果要用到外部类的东西(比如Context)在线程内部采用弱引用保存Context引用


  1. public class ThreadActivity extends Activity {  

  2.     public void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.activity_main);  
  5.         new MyThread().start();  
  6.     } 
  7. private void dosomthing(){  
  8. }

  9. private static class MyThread extends Thread{
  10. WeakReference<ThreadActivity> mThreadActivityRef
  11. public MyThread(ThreadAvoidActivity activity){
  12. mThreadActivityRef = new WeakReference<ThreadAvoidActivity>(activity)
  13. }
  14. @Override  
  15. public void run(){
  16. super.run();
  17. if (mThreadActivityRef == null)  //如果被回收了
  18. return; 
  19. if(mThreadActivityRef.get() != null)   //木有被回收
  20.  mThreadActivityRef.get().dosomthing();  
  21. }
  22. }
  1. }

 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值