Подтвердить что ты не робот

Как остановить 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();
    }
};

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

4b9b3361

Ответ 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);
    }