【问题标题】:Application lifecycle and onCreate method in the the android sdkandroid sdk中的应用程序生命周期和onCreate方法
【发布时间】:2010-04-19 20:41:48
【问题描述】:

我拼凑了一个简单的测试应用程序,它有一个按钮,当用户点击它时会发出声音。方法如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button b = (Button)findViewById(R.id.easy);
    b.setOnClickListener(this);
}

public void onClick(View v) {
    MediaPlayer mp = MediaPlayer.create(this, R.raw.easy);
    mp.start();
    while(true) {
        if (!mp.isPlaying()) {
            mp.release();
            break;
        }
    }
}

我的问题是,为什么 onCreate 表现得像在一个 while 循环中?我可以随时单击按钮,它会发出声音。我可能认为它只是侦听器的一个属性,但 Button 对象不是成员变量。我以为 Android 只会通过 onCreate onse,然后继续下一个生命周期方法。

另外,我知道我目前查看声音是否正在播放的方法很糟糕......我稍后会谈到。 :)

谢谢。

【问题讨论】:

    标签: java android button listener


    【解决方案1】:

    您正在根据您编写的代码来考虑按钮实例,而不是在框架构建的视图中存在的实例。您的 Button 变量 (b) 只是对它的引用。一旦 onCreate 方法超出范围,您的引用就不再存在,但该按钮仍然存在于您的 UI 中。您的引用足够长,可以将侦听器方法附加到它,因此对于按钮的生命周期(显然,在 onCreate 来来去去之后您仍然可以在 UI 中看到)与您何时可以看到它而不是更相关您创建的变量的范围。

    顺便说一句...我知道您才刚刚开始,您的 MediaPlayer 代码刚刚被放在一起,但为了将来参考,您不需要 while 循环。 MediaPlayer 给你一个 onCompletionListener 回调:

    OnCompletionListener

    【讨论】:

    • 这并不是说“你不需要一个while循环”——拥有那个while循环会占用主应用程序线程,冻结你的用户界面,并最终导致Android终止你的活动。
    • 啊,谢谢你的方法。 :) 无论如何,所以你说我删除了指针,但没有删除对象本身,并且因为 UI 保留了对按钮的引用,JVM(或我们称之为 JVM 的 android 版本)保留了它.如果是这种情况,那么这意味着按钮将持续到应用程序关闭,或者直到活动结束(或者它离开屏幕)?再次感谢。
    • 这只是意味着,不要认为按钮的生命周期与指向它的变量的生命周期相同。 Android 框架中构建 UI 的机制(在这种情况下,从您创建的 xml 文件构建对象图并将其显示在屏幕上)控制它创建的对象的生命周期。在这种情况下,Activity 拥有它,我想只要它是可见的,它就在范围内。同样,只要有对它的引用,您的侦听器对象就在范围内。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2012-06-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多