Handler内存泄露的改进(18)
Handler内存泄露的改进(18)
flyqilong 发表于2年前
Handler内存泄露的改进(18)
  • 发表于 2年前
  • 阅读 15
  • 收藏 0
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: Handler内存泄露问题:(退出程序时,Handler还持有外部类对象的引用,所以就算主Activity退出了,实际还没退出,还在运行,浪费内存) 解决方式: 1.定义一个内部类的时候,会默认持有外部类的引用,所以定义一个内部类的时候最好定义为静态内部类,因为静态不依赖于内部类的对象引用 2.使用弱引用 强应用(即我们经常new的对象的方式,它不会回收内存)》软引用(即没有内存时才去回收内存)》弱引用(即引用的对象不存在就得不到引用)
//平时我们用以下这种写法会存在内存泄露
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
	if (msg.what == 1) {
	   text_show.setText((String) msg.obj);
	  }
		};
	};
//所以为了改进这个,以下方式使用了弱引用的方式来声明,对上面的这种方法进行改进
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	// hangdler使用弱引用进行内存泄露优化
	private final MyHandler handler = new MyHandler(this);//this代表了传入的Activity

	// 建一个静态内部类
	private static class MyHandler extends Handler {
		// 弱引用对象
		WeakReference<MainActivity> weakReference;

		// 定义一个构造函数,传入一个MainActivity
		public MyHandler(MainActivity activity) {
			weakReference = new WeakReference<MainActivity>(activity);
		}

		// 实现Handler里面的方法
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			// 通过软引用对到MainActivity对象进行引用
			MainActivity activity = weakReference.get();
			if (activity != null) {// 如果MainActivity没有退出,获取到的不是空你才进行下一步操作进行发送消息

			}
		}
	}
}


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 3
博文 93
码字总数 53900
×
flyqilong
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: