【问题标题】:Android Button Listener lifecycleAndroid 按钮监听器生命周期
【发布时间】:2016-05-10 17:15:21
【问题描述】:

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

据我了解,android可以在onPauseonStop之后清理资源。这是否意味着我必须检查听众是否仍然存在并在onResume 中根据需要重新创建它们?当用户点击返回、主页、接听电话等时。

【问题讨论】:

  • 为什么你认为 android (gc) 会清理你的监听器。直到onDestroy 活动仍然有一个按钮上的链接和按钮上的监听器链接。

标签: android button onclicklistener activity-lifecycle


【解决方案1】:

没错,Android 可以清理资源,但不能清理内存中运行时重要的对象 :-) 您设置的 Listeners 将与 Views 本身一样长。但是,您在 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 可能会释放一些大的东西,比如图像。

【讨论】:

  • 那么这意味着当使用全局变量来存储诸如图片Uri之类的东西时,如果我出于某种原因中断应用程序,它实际上可能会变为null?
  • 或多或少,但我的意思是局部字段而不是全局变量(你不应该在 Android 中使用全局变量,除非你想定义一些常量值)。我将在答案中添加一个示例:-)
  • 这很有趣,因为我的应用程序依赖于在多个活动中处理单个图像,我通过持有对其 Uri 的全局引用(因为我需要多种方法中的 Uri)并通过意图传递 Uri 来做到这一点其他活动中的流程。
  • 好吧,如果它只是一个保存在静态字段中的字符串,那没关系,它是一个常量。您不想要的是将位图保存在可从多个活动访问的静态字段中:-)
  • 通常最好的做法是在 onPause 中释放内容并在 onResume 中重新添加它们。另外,请记住 onResume 将在 onCreate 之后立即调用,因此请避免做两次 ^^
猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 2013-04-09
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多