处理程序类和内存泄漏

时间:2012-10-21 13:28:48

标签: android memory-leaks

因此,着名的月球着陆器示例会出错:

此处理程序类应该是静态的,否则可能会发生泄漏!

   public LunarView(final Context context, final AttributeSet attrs) {

    super(context, attrs);

    // register our interest in hearing about changes to our surface
    final SurfaceHolder holder = getHolder();
    holder.addCallback(this);

    // create thread only; it's started in surfaceCreated()

//这里的问题

    thread = new LunarThread(holder, context, new Handler() {

        @Override
        public void handleMessage(final Message m) {
            mStatusText.setVisibility(m.getData().getInt("viz"));
            mStatusText.setText(m.getData().getString("text"));
        }
    });

我是Android的新手,无法找到任何解决方案。我“尝试”使用Android API 15。

2 个答案:

答案 0 :(得分:1)

所以解决方案:(谢谢谁回复我)

private static class InvalidateHandler extends Handler {

    public InvalidateHandler(LunarView view){
        new WeakReference<LunarView>(view);
    }
    @Override
    public void handleMessage(final Message m) {

        mStatusText.setVisibility(m.getData().getInt("viz"));
        mStatusText.setText(m.getData().getString("text"));
    }
};

在农历班结束时!!然后修改通话:

    thread = new LunarThread(holder, context, new InvalidateHandler(this));

刚刚建议!!警告已经消失了!!

全部谢谢!! (我也是)!!

答案 1 :(得分:0)

就像它说的那样。 Handler类应该是静态的

因此,如果您定义Handler,就像定义内部类一样,并在上下文中使用WeakReference

static class StaticHandler() {

    WeakReference<MyActivity> reference;

    public StaticHandler(MyActivity activity) {
        reference = new WeakReference<MyActivity>(activity);
    }

    @Override
    public void handleMessage(final Message m) {
        mStatusText.setVisibility(m.getData().getInt("viz"));
        mStatusText.setText(m.getData().getString("text"));
    }
}

然后调用它:

thread = new LunarThread(holder, context, new StaticHandler(this));

如果您在StaticHandler中使用context变量,则必须调用WeakReference来获取上下文:

MyActivity activity = reference.get();

阻止它泄漏。

我不知道代码的其余部分如何,但您可能必须将另一个参数传递给StaticHandler类。