Как остановить 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();
}
};
Расскажите, пожалуйста, как и где я должен отключить этот поток.
Ответы
Ответ 1
Вы можете использовать это, чтобы остановить этот работоспособный
handler.removeCallbacks(calendarUpdater);
removeCallbacks (Runnable r): Удалить все ожидающие сообщения Runnable r
, которые находятся в очереди сообщений.
Изменить
Вы можете организовать свой код следующим образом
В вашем onCreate()
из 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()
Унаследовано от следующей ссылки
Повторить задачу с задержкой?
Ответ 2
Попробуйте использовать строку ниже,
handler.removeMessages(0);
Удалите все ожидающие сообщения сообщений с кодом what
, которые находятся в очереди сообщений.
Ответ 3
Обработчик не должен останавливаться или запускаться. Это просто шлюз для отправки сообщений и Runnables в очередь потоков. В вашем случае вы отправляете Runnable, который будет запускаться в потоке обработчика. Вы должны остановить этот Runnable. Итак, поместите чек в цикл for
, чтобы сломать его.
Вы также можете использовать removeCallbacks(Runnable r)
в Handler
для отмены опубликованных Runnable
. Но это не удалит те Runnable
, которые уже запущены.
Ответ 4
Вы должны попробовать это onStop()
:
handler.removeCallbacksAndMessages(calendarUpdater);
Ответ 5
Сделать обработчик полем. Затем в вашей активности переопределите метод onStop и вызовите обратный вызов обработчика следующим образом:
@Override
protected void onStop() {
super.onStop();
handler.removeCallbacks(calendarUpdater);
}