3

ユーザーがボタンを押した後、指定された時間でアラートをトリガーするアプリが必要です。ドキュメンテーションを見ると、私が必要としているのは Handler のように見えます。

しかし、postDelayed を使用しているにもかかわらず、ルーチンがすぐに実行されていることがわかりました。明らかな何かが欠けていることは知っていますが、それを見ることができません。以下のコードでは、1 分待つのではなく、すぐに電話を振動させるのはなぜですか?

 ...

   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;
   }
4

3 に答える 3

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);
于 2010-11-02T17:42:26.997 に答える
2

run()Vibrateのメソッドを作成する必要があります。

private class Vibrate implements Runnable {
  public void run(){
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
    v.vibrate(300);
    //return null; don't return anything
  }
}
于 2010-11-02T17:41:23.487 に答える
0

最も簡単な方法は、Runnable の匿名オブジェクトを使用することです。

...

最終ボタン ボタン = (ボタン) findViewById(R.id.btnRun); 最終ハンドラ 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);
        }
    });

...

于 2013-10-24T07:20:38.467 に答える