为什么Handler不按预期触发警报?

时间:2010-11-02 17:34:31

标签: android handler alerts postdelayed

我需要我的应用程序在用户按下按钮后触发指定时间的警报。该文档使得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;
   }

3 个答案:

答案 0 :(得分:3)

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

handler.postDelayed(Vibrate(), 60000)会立即调用Vibrate()方法,然后运行振动器。实际上Vibrate()返回null?您认为处理程序将使用null引用做什么?你很幸运它不会抛出NullPointerException。有太多关于如何正确实现处理程序的例子......只需在谷歌上挖掘一点。

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

然后:

handler.postDelayed(new Vibrate(), 60000);

答案 1 :(得分:2)

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

private class Vibrate implements Runnable {
  public void run(){
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
    v.vibrate(300);
    //return null; don't return anything
  }
}

答案 2 :(得分:0)

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

...

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

振动器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);
        }
    });

...