2014-12-22 5 views
1

Попробуйте использовать TimerTask() с Handler(), связанным с postDelayed, чтобы обновить мое уведомление, выполняющее задачу метода каждые 1сек, но я, кажется, нажимаю на стену, реализуя ее правильно из внешнего вида вещей. Вот пример из моего кода:Использование обработчика с Postdelayed для обновления Уведомления

Timer timer = new Timer(); 
    TimerTask task = new TimerTask(){ 

      @Override 
      public void run() { 
       updateNotificationUi(); 
      } 
     }; 

     timer.scheduleAtFixedRate(task, 0, 1000); 
} 

Затем updateNotificationUi() метод Код:

private void updateNotificationUi() { 

    new Handler().postDelayed(new Runnable(){ 

     @Override 
     public void run() { 

      if(isRunning) { 

    mNotificationBuilder.setContentTitle("Text").setContentText("This value here updates every 1 sec").setSmallIcon(R.drawable.ic_launcher); 

mNotifyManager.notify(notificationID, mNotificationBuilder.build()); 


      } 
     } 

    }, 1000); 
} 

Я получаю ошибку при запуске мое приложение является 12-22 07:37:20.556: E/AndroidRuntime(6555): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() Любые предложения о том, как решить эту проблему?

ответ

1

Да, есть более элегантное решение

Вы могли бы определить обработчик и Runnable как глобальные переменные, как это (обратите внимание на «postDelayed» внутри работоспособной):

Handler myHandler; 

Runnable runnable = new Runnable(){ 

    @Override 
    public void run() { 

     if(isRunning) { 

      mNotificationBuilder.setContentTitle("Text").setContentText("This value here updates every 1 sec").setSmallIcon(R.drawable.ic_launcher); 

      mNotifyManager.notify(notificationID, mNotificationBuilder.build()); 

      myHandler.postDelayed(runnable, 1000); 
     } 
    } 

}; 

... 

А потом в ваш метод запуска цикла:

private void updateNotificationUi() { 

    myHandler = new Handler(); 

    myHandler.postDelayed(runnable, 1000); 
} 

возможно, вам понадобится условие остановки тоже, может быть, логический флаг arroung «postDelayed» внутри работоспособной. Что-то вроде этого:

if(shouldContinueLooping){ 
    myHandler.postDelayed(runnable, 1000); 
} 
+0

'runnable' должен быть объявлен как' final' – muaaz

1

попытка вызова обработчика, как это: (погуглить немного больше помог бы)

new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){ 

     @Override 
     public void run() { 

      if(isRunning) { 

    mNotificationBuilder.setContentTitle("Text").setContentText("This value here updates every 1 sec").setSmallIcon(R.drawable.ic_launcher); 

mNotifyManager.notify(notificationID, mNotificationBuilder.build()); 


      } 
     } 

    }, 1000); 
1

Вы не можете построить mNotificationBuilder внутри нити без использования UI thread. то же самое касается AlertDialogs.

См. this post.