我想确保我的应用程序尽可能高效地运行,并正在调查活动生命周期。特别是,我在活动setOnClickListeners
中创建了按钮onCreate
。
据我了解,android可以清除onPause
或onStop
之后的资源。这是否意味着我必须检查侦听器是否仍然存在,并根据需要在onResume
中重新创建它们?用户单击返回时,回家,接到电话等。
最佳答案
没错,Android可以清理资源,但不能清理内存中的运行时重要对象:-)只要Listeners
自己设置的Views
都将保留在那里。但是,在Listeners
中引用的内容在调用时可能不存在,因此请确保检查您访问的对象是否不为null :-)
如果您需要更多了解,请阅读Java gc机制的工作原理:-) Views
中的Activity
绑定到其gc树,因此只要Activity
存在,它们就很安全。并且当重新创建它时,onCreate
将再次被调用:-)
这里有一个简单的例子:
/** This is hand code, it won't compile most probably ^^ **/
public class myActivity extends Activity {
private DataBase db;
private Button button;
public void onCreate(){
db = /* init db somehow */
button = (Button) findViewById(R.id.button);
button.setOnclickListener(new OnClickListener() {
public void onClick(View view) {
db.doSomething();
}
});
}
public void closeDatabase() {
db = null;
}
}
现在想象一下,由于某种原因,您调用了closeDatabase()方法。如果用户在此之后单击该按钮,则该应用程序将崩溃,并显示NullPointerException。
当然,这是一个直接的示例(即,您使代码中的db对象为空),但是它可能会在系统内部自动发生,并且(很少)会发生,因为gc可能会释放一些大的东西,例如图像。