我正在通过直接继承view类来编写一个自定义视图,我想知道我是否充分利用了weakreference类。首先,这是我课堂上最相关的部分:
public class ChessView extends View {
public ChessView(Context context, AttributeSet attrs, int defStyle) {
/* some code removed */
invalidateHandler = new InvalidateHandler(this);
new Thread(new Runnable() {
@Override
public void run() {
invalidateHandler.sendMessage(invalidateHandler.obtainMessage());
}
}).start();
}
/* some code removed */
private static class InvalidateHandler extends Handler {
public InvalidateHandler(ChessView view){
relatedChessView = new WeakReference<ChessView>(view);
}
@Override
public void handleMessage(Message msg) {
relatedChessView.get().invalidate();
}
private WeakReference<ChessView> relatedChessView;
};
private InvalidateHandler invalidateHandler;
}
如你所见:
我正在创建一个静态的内部类,handler类的子类:正如android开发指南所建议的那样,避免在视图子类中直接使用内部类
处理程序静态内部类调用了我的自定义chessview的invalidate()方法:因此我决定将它“包装”在weakreference中,正如android开发指南所建议的那样,以避免视图实例上的硬引用。
我的问题是:
我能这样避免内存泄漏吗?
weakreference是最好的类型,还是应该改用softreference?
最后,只要视图可见(或相关活动处于活动状态),自定义视图是否仍保留在堆中,或者是否可以由GC在调用relatedChessView.get()时使用空引用来收集它?
提前谢谢,如果我的问题表述不好,请道歉。
最佳答案
我能这样避免内存泄漏吗?
是的,但这不是必须的。
weakreference是最好的类型,还是应该改用softreference?WeakReference
是你的方法。SoftReference
和WeakReference
都可用,只要有指向它们的硬引用。如果没有强引用,WeakReference
将更有可能被收集,而SoftReference
将保留您的对象,只要不需要清理内存(例如,SoftReference
将停留更长时间)。
最后,只要视图可见(或相关活动处于活动状态),自定义视图是否仍保留在堆中,或者是否可以由GC在调用relatedChessView.get()时使用空引用来收集它?
是的,会的。正如我前面提到的,当存在任何包含WeakReference
引用的Objects
时,将不会收集到Object
。
更新:修正了基于@deev答案的弱引用和软引用信息,使其更加准确。
关于android - 为了在静态内部类中引用我的自定义 View ,WeakReference是否是一个好的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11900790/