我需要我的应用程序在用户按下按钮后的指定时间内触发警报。文档使它看起来像是我所需要的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);