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 会在最晚的时候(有内存溢出风险)释放.