几天前,我接受了采访。
我遇到了用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”运行,但立即销毁。 但是,由于使用了处理程序,因此无法从内存中释放活动。
面试结束后,我试图在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()”函数中删除处理程序的回调和消息。
当我检查“事件探查器”时,有时活动仍然存在。
为什么?
什么是完美的解决方案?