Android 按钮监听器生命周期
Android Button Listener lifecycle
我想确保我的应用尽可能高效地运行,并且正在研究 activity 生命周期。特别是,我在 activity onCreate
中创建了按钮 setOnClickListeners
。
据我了解,android可以在onPause
或onStop
之后清理资源。这是否意味着我必须检查侦听器是否仍然存在并在 onResume
中根据需要重新创建它们?当用户点击返回、主页、接听电话等时
是的,Android 可以清理资源,但不能清理内存中的运行时重要对象:-) 只要 Views
本身,您设置的 Listeners
就会保留在那里。但是,您在 Listeners
中引用的内容在调用时可能不存在,因此请确保检查您访问的对象是否不为 null :-)
如果您需要更深入地了解它,请阅读 Java gc 机制的工作原理:-) Activity
中的 Views
绑定到它的 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 对象为 null)但它可能会在系统内部自动发生并且(很少)因为 gc 可能会释放一些大的东西,比如图像。
我想确保我的应用尽可能高效地运行,并且正在研究 activity 生命周期。特别是,我在 activity onCreate
中创建了按钮 setOnClickListeners
。
据我了解,android可以在onPause
或onStop
之后清理资源。这是否意味着我必须检查侦听器是否仍然存在并在 onResume
中根据需要重新创建它们?当用户点击返回、主页、接听电话等时
是的,Android 可以清理资源,但不能清理内存中的运行时重要对象:-) 只要 Views
本身,您设置的 Listeners
就会保留在那里。但是,您在 Listeners
中引用的内容在调用时可能不存在,因此请确保检查您访问的对象是否不为 null :-)
如果您需要更深入地了解它,请阅读 Java gc 机制的工作原理:-) Activity
中的 Views
绑定到它的 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 对象为 null)但它可能会在系统内部自动发生并且(很少)因为 gc 可能会释放一些大的东西,比如图像。