回调中可能的内存泄漏

时间:2019-07-09 08:55:52

标签: java android

我怀疑可能存在内存泄漏。由于ServerManager将保留回调链接,因此此回调将保留激活链接。这段代码中会有内存泄漏吗?

Ativity {
    TextView textView;
    Handler h = new MyHandler();

    interface Update{
        void update(Data data);
    }

    private Update listener = new Update() {
        @Override
        public void update(Data data) {         
                textView.setText(data.getText());               
                handler.sendEmptyMessage(100);
        }   
    }

    @Override
    public void onCreate() {
        super.onCreate();
        textView = findViewById(R.id.textView);
        ServerManager.getInstance().addCallBack(listener);//Will keep a link to the implementation of the interface
    }

     private class MyHandler extends Handler {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 100:
                    textView.setText("бла бла");
                    return;
            }
        }
    }
}

CallBack会保留指向该片段的链接吗?如何做得更好?

1 个答案:

答案 0 :(得分:0)

如果Update是单例,肯定存在上下文泄漏:它持有对ServerManager实例的引用,该实例(作为非静态内部类)持有对活动声明的引用它。

解决方案的示例可能是:

  • onDestroy添加取消注册方法,然后从对称生命周期回调中调用该方法(onCreateonStoponStartapp/graphql/types/item_type.rb, ...)

  • 使用WeakReference,这不会阻止收集引用的对象。