我想确保我的应用程序尽可能高效地运行,并正在调查活动生命周期。特别是,我在活动setOnClickListeners中创建了按钮onCreate

据我了解,android可以清除onPauseonStop之后的资源。这是否意味着我必须检查侦听器是否仍然存在,并根据需要在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可能会释放一些大的东西,例如图像。

09-04 18:50