非静态内部类可能导致的内存泄漏及其优化

来源:互联网 发布:mac os 10.13 开机慢 编辑:程序博客网 时间:2024/06/05 02:47
转自http://blog.csdn.net/lfdfhl/article/details/45696165
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package cc.cc;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5.   
  6. /** 
  7.  * Demo描述: 
  8.  * 非静态内部类可能导致的内存泄露及其优化 
  9.  *  
  10.  * 在MainActivity中定义了两个内部类InnerClassTest和ThreadSubClass. 
  11.  * 在这里需要注意一个问题: 
  12.  * 内部类持有外部类的引用!!!! 
  13.  * 或者说内部类对外部类持有隐式的引用!!!! 
  14.  *  
  15.  * 假如我们在内部类中做耗时的操作或者说有个while(true)死循环,即内部类的对象一直存在; 
  16.  * 那么当这个MainActivity应该被回收时(比如屏幕的旋转)GC发现它还被其内部类的对象引用 
  17.  * 所以就不会将其回收.假如该Activity中含有大量的资源(比如图片)那么就很容易发生OOM. 
  18.  *  
  19.  * 优化方式: 
  20.  * 使用静态的内部类,这样的内部类就不会持有外部类的隐式引用;也就不会影响到GC对于外部类的回收 
  21.  *  
  22.  *  
  23.  * 参考资料: 
  24.  * 1 http://blog.csdn.net/guolin_blog/article/details/42238633 
  25.  * 2 http://blog.csdn.net/tu_bingbing/article/details/10395129 
  26.  * 3 http://blog.csdn.net/zhangjg_blog/article/details/20000769 
  27.  * 4 http://blog.csdn.net/zhongwcool/article/details/22886067 
  28.  * 5 http://foolog.net/wap/index-wap2.php?p=2550 
  29.  * 6 http://blog.csdn.net/theone10211024/article/details/45645309 
  30.  * 7 http://blog.csdn.net/tu_bingbing/article/details/10350533 
  31.  * 8 http://www.eoeandroid.com/thread-571279-1-1.html 
  32.  * 9 http://2dxgujun.com/post/2014/09/11/Handler-Leaks-Solution.html 
  33.  *   Thank you very much 
  34.  * 
  35.  */  
  36. public class MainActivity extends Activity {  
  37.     private BetterThread mBetterThread;  
  38.     @Override  
  39.     protected void onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         setContentView(R.layout.main);  
  42.     }  
  43.       
  44.     private void init(){  
  45.         mBetterThread=new BetterThread();  
  46.         mBetterThread.start();  
  47.     }  
  48.       
  49.       
  50.     //定义一个内部类  
  51.     private class InnerClassTest {  
  52.   
  53.         private InnerClassTest() {  
  54.   
  55.         }  
  56.   
  57.         private void methodA() {  
  58.             //Activity activity=MainActivity.this;  
  59.         }  
  60.   
  61.         private void methodB() {  
  62.   
  63.         }  
  64.   
  65.     }  
  66.       
  67.       
  68.     //定义一个内部类  
  69.     private class ThreadSubClass extends Thread{  
  70.         @Override  
  71.         public void run() {  
  72.             super.run();  
  73.             //Activity activity=MainActivity.this;  
  74.         }  
  75.           
  76.     }  
  77.       
  78.       
  79.       
  80.     //优化后的方式  
  81.     private static class BetterThread extends Thread {  
  82.         private boolean isRunning = true;  
  83.         @Override  
  84.         public void run() {  
  85.             super.run();  
  86.             while(isRunning){  
  87.                 //doing something  
  88.             }  
  89.         }  
  90.           
  91.         public void stopThread(){  
  92.             isRunning=false;  
  93.         }  
  94.     }  
  95.       
  96.       
  97.     //停止线程  
  98.     @Override  
  99.     protected void onDestroy() {  
  100.         mBetterThread.stopThread();  
  101.         super.onDestroy();  
  102.     }  
  103.   
  104. }  
0 0
原创粉丝点击