我怀疑可能存在内存泄漏。由于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会保留指向该片段的链接吗?如何做得更好?
答案 0 :(得分:0)
如果Update
是单例,肯定存在上下文泄漏:它持有对ServerManager
实例的引用,该实例(作为非静态内部类)持有对活动声明的引用它。
解决方案的示例可能是:
向onDestroy
添加取消注册方法,然后从对称生命周期回调中调用该方法(onCreate
为onStop
,onStart
为app/graphql/types/item_type.rb
, ...)
使用WeakReference,这不会阻止收集引用的对象。