我正在通过直接继承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是你的方法。SoftReferenceWeakReference都可用,只要有指向它们的硬引用。如果没有强引用,WeakReference将更有可能被收集,而SoftReference将保留您的对象,只要不需要清理内存(例如,SoftReference将停留更长时间)。
最后,只要视图可见(或相关活动处于活动状态),自定义视图是否仍保留在堆中,或者是否可以由GC在调用relatedChessView.get()时使用空引用来收集它?
是的,会的。正如我前面提到的,当存在任何包含WeakReference引用的Objects时,将不会收集到Object
更新:修正了基于@deev答案的弱引用和软引用信息,使其更加准确。

关于android - 为了在静态内部类中引用我的自定义 View ,WeakReference是否是一个好的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11900790/

10-09 03:36