package cc.cc;
import android.os.Bundle;
import android.app.Activity;
/**
* Demo描述:
* 非静态内部类可能导致的内存泄露及其优化
*
* 在MainActivity中定义了两个内部类InnerClassTest和ThreadSubClass.
* 在这里需要注意一个问题:
* 内部类持有外部类的引用!!!!
* 或者说内部类对外部类持有隐式的引用!!!!
*
* 假如我们在内部类中做耗时的操作或者说有个while(true)死循环,即内部类的对象一直存在;
* 那么当这个MainActivity应该被回收时(比如屏幕的旋转)GC发现它还被其内部类的对象引用
* 所以就不会将其回收.假如该Activity中含有大量的资源(比如图片)那么就很容易发生OOM.
*
* 优化方式:
* 使用静态的内部类,这样的内部类就不会持有外部类的隐式引用;也就不会影响到GC对于外部类的回收
*
*
* 参考资料:
* 1 http://blog.csdn.net/guolin_blog/article/details/42238633
* 2 http://blog.csdn.net/tu_bingbing/article/details/10395129
* 3 http://blog.csdn.net/zhangjg_blog/article/details/20000769
* 4 http://blog.csdn.net/zhongwcool/article/details/22886067
* 5 http://foolog.net/wap/index-wap2.php?p=2550
* 6 http://blog.csdn.net/theone10211024/article/details/45645309
* 7 http://blog.csdn.net/tu_bingbing/article/details/10350533
* 8 http://www.eoeandroid.com/thread-571279-1-1.html
* 9 http://2dxgujun.com/post/2014/09/11/Handler-Leaks-Solution.html
* Thank you very much
*
*/
public class MainActivity extends Activity {
private BetterThread mBetterThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
private void init(){
mBetterThread=new BetterThread();
mBetterThread.start();
}
//定义一个内部类
private class InnerClassTest {
private InnerClassTest() {
}
private void methodA() {
//Activity activity=MainActivity.this;
}
private void methodB() {
}
}
//定义一个内部类
private class ThreadSubClass extends Thread{
@Override
public void run() {
super.run();
//Activity activity=MainActivity.this;
}
}
//优化后的方式
private static class BetterThread extends Thread {
private boolean isRunning = true;
@Override
public void run() {
super.run();
while(isRunning){
//doing something
}
}
public void stopThread(){
isRunning=false;
}
}
//停止线程
@Override
protected void onDestroy() {
mBetterThread.stopThread();
super.onDestroy();
}
}