web-dev-qa-db-fra.com

Comment arrêter Handler sur Android

Dans mon application, j'ai créé un calendrier avec Gridview et, dans Gridview, j'affiche les dates et certaines disponibilités d'événements à l'aide d'Imageview. Pour ce faire, j'ai créé un gestionnaire. 

Maintenant, je veux arrêter le gestionnaire.

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();
    }
};

S'il vous plaît dites-moi comment et où je devrais désactiver ce fil.

13
Abhishek Dhiman

Vous pouvez utiliser cela pour arrêter ce runnable

handler.removeCallbacks(calendarUpdater);

removeCallbacks (Runnable r) : Supprimez toutes les publications en attente de Runnable r qui sont dans la file d'attente des messages.

Modifier

Vous pouvez organiser votre code comme ceci

dans 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);
}

Maintenant, vous pouvez simplement appeler startRepeatingTask() pour envoyer un message et cesser d’utiliser stopRepeatingTask().

Hérité du lien suivant

Répéter une tâche avec un délai?

22
Juned

Essayez ci-dessous la ligne,

handler.removeMessages (0);

Supprimez toutes les publications en attente de messages avec le code what qui sont dans la file d'attente des messages.

12
MuraliGanesan

Le gestionnaire n'a rien à être arrêté ou démarré . C'est juste une passerelle pour poster des messages et des runnables sur le thread de file d'attente. Dans votre cas, vous publiez un fichier Runnable, qui sera exécuté sur le fil du gestionnaire. Vous devez arrêter ce Runnable. Alors, cochez cette boucle forpour la casser.

Vous pouvez également utiliser removeCallbacks(Runnable r) on Handlerpour annuler les Runnablename __ publiés. Mais cela ne supprimera pas les Runnablename __ qui sont déjà en cours d'exécution.

8
S.D.

Faites de handler un champ. Ensuite, dans votre activité, substituez la méthode onStop et arrêtez le gestionnaire de rappeler des messages comme celui-ci:

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

Vous devriez essayer cette onStop():

handler.removeCallbacksAndMessages(calendarUpdater);
0
John Wayne