最佳答案
我一直在阅读一些关于Android内存泄漏的文章,并观看了谷歌I/O 关于这个问题的这个有趣的视频。
尽管如此,我还是不完全理解这个概念,尤其是当它对用户Activity中的内部类是安全的还是危险的时候。
这就是我的理解:
如果内部类的实例比外部类(Activity)存活的时间长,就会发生内存泄漏。 -> 在什么情况下会发生这种情况?在这个例子中,我认为没有泄漏的风险,因为匿名类扩展OnClickListener
不可能比活动存活得更久,对吗?
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog_generic);
Button okButton = (Button) dialog.findViewById(R.id.dialog_button_ok);
TextView titleTv = (TextView) dialog.findViewById(R.id.dialog_generic_title);
// *** Handle button click
okButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
titleTv.setText("dialog title");
dialog.show();
这个例子危险吗?为什么?
// We are still inside an Activity
_handlerToDelayDroidMove = new Handler();
_handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000);
private Runnable _droidPlayRunnable = new Runnable() {
public void run() {
_someFieldOfTheActivity.performLongCalculation();
}
};
我对这样一个事实表示怀疑,即理解这个主题必须详细理解当一个活动被破坏和重新创建时保留了什么。
是吗?
假设我刚刚改变了设备的方向(这是泄漏的最常见原因)。当super.onCreate(savedInstanceState)
将在我的onCreate()
中被调用时,这将恢复字段的值(因为它们在方向改变之前)吗?这也会恢复内部类的状态吗?
我知道我的问题不是很精确,但我真的很感激任何能让事情更清楚的解释。