2010-11-02 7 views
3

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

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

handler.postDelayed(Vibrate(), 60000) немедленно вызовет метод Vibrate(), а затем запустит материал вибратора. Фактически Vibrate() возвращает null? Как вы думаете, что обработчик будет делать с нулевой ссылкой? Вам повезло, что он не бросает 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

Вам нужно написать метод 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

Я не люблю downvoting ... хотя, лучше исправить свой ответ. В этом случае, виброзвонок() действует как метод, а не как класс. – Cristian

+1

Сортировка, спасибо за хед-ап. – fredley

0

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

... 

Последняя кнопка Кнопка = (Button) findViewById (R.id. btnRun); final Обработчик обработчика = новый обработчик();

Вибратор v = (Вибратор) getSystemService (Context.VIBRATOR_SERVICE);

button.setOnClickListener (новый OnClickListener() {

 @Override 
     public void onClick(View v) { 

      handler.postDelayed(new Runnable() { 
       public void run() { 
        v.vibrate(300); 
       } 
      }, 60000); 
     } 
    }); 

...