Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么';t处理程序是否按预期触发警报?_Android_Handler_Alerts_Postdelayed - Fatal编程技术网

Android 为什么';t处理程序是否按预期触发警报?

Android 为什么';t处理程序是否按预期触发警报?,android,handler,alerts,postdelayed,Android,Handler,Alerts,Postdelayed,我需要我的应用程序在用户按下按钮后的指定时间内触发警报。文档使它看起来像是我所需要的处理程序,使用似乎是大脑死亡 然而,我发现,尽管使用了postDelayed,我的例程仍然可以立即运行。我知道我遗漏了一些明显的东西,但我就是看不到。为什么下面的代码使手机立即震动而不是等待一分钟 ... final Button button = (Button) findViewById(R.id.btnRun); final Handler handler = new 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;
   }

您需要为振动编写
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
  }
}

那是因为你做得不对。请看流程:

handler.postDelayed(Vibrate(),60000)
将立即调用
Vibrate()
方法,然后运行可控震源。事实上,
strimble()
返回空值?您认为处理程序将如何处理空引用?幸运的是,它没有抛出
NullPointerException
。关于如何正确实现处理程序的示例太多了。。。只要在谷歌上多挖一点

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


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

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

可控震源v=(可控震源)getSystemService(Context.可控震源_服务)

setOnClickListener(新的OnClickListener(){


我不喜欢向下投票…不过,你最好修正你的答案。在这种情况下,Vibrange()充当方法,而不是类。
...
        @Override
        public void onClick(View v) {

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