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.
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
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.
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 for
pour la casser.
Vous pouvez également utiliser removeCallbacks(Runnable r)
on Handler
pour annuler les Runnable
name __ publiés. Mais cela ne supprimera pas les Runnable
name __ qui sont déjà en cours d'exécution.
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);
}
Vous devriez essayer cette onStop()
:
handler.removeCallbacksAndMessages(calendarUpdater);