3

我需要我的应用在用户按下按钮后的指定时间内触发警报。该文档使它看起来像 Handler 是我需要的,并且使用似乎是脑死的。

但是,我发现尽管使用了 postDelayed,但我的例程仍会立即运行。我知道我遗漏了一些明显的东西,但我就是看不到它。为什么下面的代码让手机立即振动而不是等待一分钟?

 ...

   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;
   }
4

3 回答 3

3

那是因为你做错了。只看流程:

handler.postDelayed(Vibrate(), 60000)将立即调用该Vibrate()方法,然后运行振动器的东西。实际上Vibrate()返回null?您认为处理程序将如何处理空引用?你很幸运它没有抛出NullPointerException. 关于如何正确实现处理程序的示例太多了……只需在 google 上多挖掘一点。

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

然后:

handler.postDelayed(new Vibrate(), 60000);
于 2010-11-02T17:42:26.997 回答
2

您需要run()为 Vibrate 编写一个方法:

private class Vibrate implements Runnable {
  public void run(){
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
    v.vibrate(300);
    //return null; don't return anything
  }
}
于 2010-11-02T17:41:23.487 回答
0

最简单的方法是使用 Runnable 的匿名对象,

...

最终按钮按钮 = (Button) findViewById(R.id.btnRun); 最终处理程序处理程序 = 新处理程序();

振动器 v = (振动器) getSystemService(Context.VIBRATOR_SERVICE);

button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            handler.postDelayed(new Runnable() {
                public void run() {
                    v.vibrate(300);
                }
            }, 60000);
        }
    });

...

于 2013-10-24T07:20:38.467 回答