Почему обработчик не вызывает предупреждение, как ожидалось? - PullRequest
3 голосов
/ 02 ноября 2010

Мне нужно, чтобы мое приложение вызывало оповещение через определенное время после того, как пользователь нажал кнопку. Из документации видно, что мне нужен именно 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;
   }

Ответы [ 3 ]

3 голосов
/ 02 ноября 2010

Это потому, что вы делаете это неправильно. Просто посмотрите на поток:

handler.postDelayed(Vibrate(), 60000) немедленно вызовет метод Vibrate(), а затем запустит вибратор. На самом деле Vibrate() возвращает ноль? Как вы думаете, что обработчик будет делать с нулевой ссылкой? Вам повезло, что он не выбрасывает NullPointerException. Существует слишком много примеров того, как правильно реализовать обработчик ... просто покопайтесь немного в Google.

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

Тогда:

handler.postDelayed(new Vibrate(), 60000);
2 голосов
/ 02 ноября 2010

Вам нужно написать метод 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
  }
}
0 голосов
/ 24 октября 2013

Самый простой способ для вас - использовать анонимный объект Runnable,

...

конечная кнопка button = (кнопка) findViewById (R.id.btnRun); окончательный обработчик обработчика = новый обработчик ();

Vibrator 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);
        }
    });

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...