我需要我的应用程序在用户按下按钮后的指定时间内触发警报。文档使它看起来像是我所需要的handler,而且使用似乎已经完全停止了。
然而,我发现尽管使用了postdelated,我的程序还是立即运行。我知道我漏掉了一些显而易见的东西,但我就是看不见。为什么下面的代码会让手机立即震动而不是等待一分钟?

 ...

   final Button button = (Button) findViewById(R.id.btnRun);
   final Handler handler = new Handler();

   button.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
        ...
        handler.postDelayed(Vibrate(), 60000);

        }
    });
...

    private Runnable Vibrate() {
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    v.vibrate(300);
    return null;
   }

最佳答案

那是因为你做错了。看看流程:
handler.postDelayed(Vibrate(), 60000)将立即调用Vibrate()方法,然后运行可控震源材料。实际上Vibrate()返回空值?您认为处理程序将如何处理空引用?你很幸运它没有抛出NullPointerException。如何正确实现处理程序的例子太多了…在谷歌上多挖一点就行了。

private class Vibrate implements Runnable{
  public void run(){
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    v.vibrate(300);
  }
}

然后:
handler.postDelayed(new Vibrate(), 60000);

07-24 12:46