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