android 内存优化

private static Drawable sBackground;


@Override

protected void onCreate(Bundle state) {

super.onCreate(state);


TextView label = new TextView(this);

label.setText("Leaks are bad");


if (sBackground == null) {

sBackground = getDrawable(R.drawable.large_bitmap);

}

label.setBackgroundDrawable(sBackground);


setContentView(label);

}


label.setBackgroundDrawable(sBackground); 这句话把label作为sBackground的回调来处理的,既然drawable要调用label就会拥有label的引用。


TextView label = new TextView(this); 这句话很明显context是作为参数传给label的,所以label拥有context的引用。


如果sBackground无法被gc,那label就无法被gc,那context也无法被gc,引用context的那些资源就无法被gc,发生大的内存泄漏。


非静态内部类访问外部类一样有内存泄漏的危险.建议用静态类而且用weakreference访问外部类.


weakreference 和 softreference 的区别:

最大的区别在于 weakreference 会在第一时间(没有被引用)释放,softreference 会在最晚的时候(有内存溢出风险)释放.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值