Как остановить Handler в Android

В моем приложении я создал календарь с Gridview, и в этом Gridview я показываю даты и некоторую доступность событий с помощью Imageview, и для этого я создал обработчик.

Теперь я хочу остановить обработчик.

MainActivity.java

// inside oncreate Handler handler = new Handler(); refreshCalendar(); // outside oncreate public void refreshCalendar() { calAdapter.refreshDays(); calAdapter.notifyDataSetChanged(); handler.post(calendarUpdater); calTitle.setText(android.text.format.DateFormat.format("MMMM yyyy", cal)); } public Runnable calendarUpdater = new Runnable() { @Override public void run() { items.clear(); allData = new ArrayList<HashMap<String,String>>(); allData.clear(); allData = db.showAllEvents(); String currentDate = (String)android.text.format.DateFormat.format("MM/yyyy", cal); for(int i=0; i<allData.size(); i++) { String date[] = allData.get(i).get("date").split("/"); String md[] = currentDate.split("/"); if(date[1].equals(md[0]) && date[2].equals(md[1])) { items.add(date[0]); System.out.println("dates: "+date[0]); } } calAdapter.setItems(items); calAdapter.notifyDataSetChanged(); } }; 

Скажите, пожалуйста, как и где я должен отключить эту тему.

Solutions Collecting From Web of "Как остановить Handler в Android"

Вы можете использовать это, чтобы остановить этот runnable

 handler.removeCallbacks(calendarUpdater); 

RemoveCallbacks (Runnable r) : удалить все ожидающие сообщения Runnable r которые находятся в очереди сообщений.

редактировать

Вы можете упорядочить свой код таким образом

В onCreate of MainActivity.java

 Handler handler = new Handler(); refreshCalendar() //outside oncreate public void refreshCalendar() { calAdapter.refreshDays(); calAdapter.notifyDataSetChanged(); startRepeatingTask(); calTitle.setText(android.text.format.DateFormat.format("MMMM yyyy", cal)); } public Runnable calendarUpdater = new Runnable() { @Override public void run() { items.clear(); allData = new ArrayList<HashMap<String,String>>(); allData.clear(); allData = db.showAllEvents(); String currentDate = (String)android.text.format.DateFormat.format("MM/yyyy", cal); for(int i=0; i<allData.size(); i++) { String date[] = allData.get(i).get("date").split("/"); String md[] = currentDate.split("/"); if(date[1].equals(md[0]) && date[2].equals(md[1])) { items.add(date[0]); System.out.println("dates: "+date[0]); } } calAdapter.setItems(items); calAdapter.notifyDataSetChanged(); handler.postDelayed(calendarUpdater,5000); // 5 seconds } }; void startRepeatingTask() { calendarUpdater.run(); } void stopRepeatingTask() { handler.removeCallbacks(calendarUpdater); } 

Теперь вы можете просто вызвать startRepeatingTask() для публикации сообщения и прекратить использование stopRepeatingTask()

Унаследовано от следующей ссылки

Повторить задачу с задержкой?

Попробуй это,

handler.removeMessages (0);

Удалите все ожидающие сообщения сообщений с кодом, what находится в очереди сообщений.

Обработчику нечего останавливать или начинать . Это всего лишь шлюз для отправки сообщений и Runnables в очередь потоков. В вашем случае вы публикуете Runnable, который будет запускаться в потоке обработчика. Вы должны остановить этот Runnable. Итак, поставьте чек в том, что for цикла, чтобы разбить его.

Вы также можете использовать removeCallbacks(Runnable r) для Handler для отмены опубликованных Runnable . Но это не удалит те Runnable , которые уже запущены.

Сделайте обработчик полем. Затем в вашей деятельности переопределите метод onStop и вызовите обратные вызовы обработчика так:

 @Override protected void onStop() { super.onStop(); handler.removeCallbacks(calendarUpdater); }