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

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();
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷哥的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值