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