[英]Handler memory leak
几天前,我接受了一次采访。
我遇到了用A4纸编写的代码,我注意到这与内存泄漏问题有关。 但我无法回答如何解决。
代码在这里:
public class LeakJavaActivity extends AppCompatActivity {
private String TAG = LeakActivity.class.getSimpleName();
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d(TAG, "[MemoryLeak] handleMessage");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leak_java);
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.d(TAG, "[MemoryLeak] run!!!");
}
}, 6_000);
finish();
}
}
“ LeakJavaActivity”运行,但立即销毁。 但是,由于使用了Handler,因此Activity无法从内存中释放出来。
面试后,我尝试用Google搜索解决方案,然后找到了。 但是,当我运行代码时,仍然存在内存泄漏。
public class LeakJavaActivity extends AppCompatActivity {
private String TAG = LeakActivity.class.getSimpleName();
private final static Handler handler = new NonLeakHandler();
private final static Runnable runnable = new NonLeakRunnable();
private final static class NonLeakHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d("NonLeakHandler", "[MemoryLeak] handleMessage");
}
}
private final static class NonLeakRunnable implements Runnable {
@Override
public void run() {
Log.d("NonLeakRunnable", "[MemoryLeak] run");
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leak_java);
handler.postDelayed(runnable, 6_000);
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "[MemoryLeak] onDestroy");
handler.removeCallbacksAndMessages(null);
}
}
解决方案建议使用“静态类”。 然后在“ onDestroy()”函数中删除处理程序的回调和消息。
当我检查“事件探查器”时,有时活动仍然存在。
为什么?
完美的解决方案是什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.