onCreate() 和 onClick() 的顺序

order of onCreate() and onClick()

我的 Activity 中有一个 Button,如果在创建 Activity 后的 5 秒内没有点击它,我想让应用程序崩溃。我尝试了以下操作,但从日志记录中发现 OnClickListener 代码是在 onCreate(Bundle) 中的所有其他代码为 运行 之后执行的。所以布尔值在检查时总是 false 。我该如何解决这个问题?

private Boolean isClicked = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e("0-isClicked", String.valueOf(isClicked));
    setContentView(R.layout.activity_main_map);

    ImageView iv = (ImageView) findViewById(R.id.myBTN);
    iv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(getApplicationContext(), MainActivity.class);
            isClicked = true;
            Log.e("1-isClicked", String.valueOf(isClicked));
            startActivity(i);
        }
    });
    Log.e("2-isClicked", String.valueOf(isClicked));

    //let app crashes after 5 seconds (5000 milliseconds) if user didn't take action
    if (!isClicked) {
        Log.e("3-isClicked", String.valueOf(isClicked));
        Thread timer = new Thread() {
            public void run() {
                try {
                    sleep(5000);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    throw null;
                }
            }
        };
        timer.start();
    }   
}

这就是 LogCat 给出的结果:

E/0-isClicked﹕ false
E/2-isClicked﹕ false
E/3-isClicked﹕ false
E/1-isClicked﹕ true

我想你必须明白什么时候运行oncreate。您的前三个日志语句来自 onCreate,应该是:

E/0-onCreate﹕ false
E/2-onCreate﹕ false
E/3-onCreate﹕ false

http://www.codelearn.org/android-tutorial/android-activity

您可以使用 Timer 设置一个任务在 5 秒后执行,在该任务中您可以完成 activity。在 onCreate()

上创建计时器
timer = new Timer(); // Keep the timer (of type Timer) as a member of the activity class so you can access it later
timer.scheduleTask(timerTaskInstance, 5000); // timerTaskInstance is an instance of TimerTask for which you should override the run() method

现在,如果在计时器超时之前单击按钮,只需在按钮的侦听器方法上取消计时器:

timer.cancel();

有关 TimerTask

的更多信息

我会反过来做:如果在 5 秒内用户没有点击,您的应用程序无论如何都会崩溃。

为了减轻疼痛,您可以使用 CountdownTimer 并执行以下操作:

public void onCreate(){
  new CountDownTimer(5000, 1000) {

     public void onTick(long millisUntilFinished) {
        Log.e("isClicked", String.valueOf(isClicked));
     }

     public void onFinish() {
        if(!isClicked) throw null;
     }
  }.start();
}