0

J'ai ListFragment et AsyncTaskLoader qui récupère des données à partir d'Internet. ListFragment est rempli par BaseAdapter.Notify Fragment lorsque LoaderManager démarre le chargement

Lors du chargement des données, BaseAdapter remplit la première ligne avec la barre de progression de rotation. Lorsque les données sont chargées et qu'aucune erreur ne s'est produite, les données sont renseignées dans ListView. Mais si une erreur s'est produite (j'ai un drapeau dans AsyncTaskLoader indiquant cette erreur), puis BaseAdapter remplir la première ligne avec un message d'erreur.

Problème:

Une fois le chargement contient des erreurs, LoaderManager tente automatiquement de charger les données à nouveau (forceLoad() appelé), ce qui est bon. Mais ce dont j'ai besoin est de notifier BaseAdapter que les données sont en cours de chargement afin BaseAdapter peut changer le message d'erreur à la barre de progression tournante.

Existe-t-il un moyen facile de notifier un fragment lorsque LoaderManager appelle forceLoad()?

Ma suggestion:

ListFragment mettra en œuvre l'interface ci-dessous et de transmettre cette ListFragment dans le constructeur de AsyncTaskLoader.

public interface LoadingListener { 
    public void onLoadingStatusChanged(boolean isLoading); 
} 

Ensuite, je peux appeler onLoadingStatusChanged(true) dans loadInBackground() et onLoadingStatusChanged(false) dans deliverResult(T data). J'ai peur que la référence à Fragment dans AsyncTaskLoader puisse contenir ce fragment.

Répondre

0

Votre suggestion de mise en œuvre est un bon moyen de gérer les choses. Bien que Loader présente déjà des rappels pour OnLoadComplete et OnLoadCanceled, un rappel démarré est le seul ajout que vous devez faire. Vous pouvez également implémenter un rappel OnLoadStart personnalisé qui se déclenche à chaque fois que onForceLoad() ou onStartLoad() est appelé par opposition à loadInBackground et qu'il reflète plus fidèlement les rappels de structure existants. Je suggère que, tout comme les rappels de framework, vous configuriez des méthodes pour enregistrer et désenregistrer l'écouteur plutôt que de le passer dans le constructeur, ainsi votre fragment peut se joindre/se retirer dans le cadre du cycle de vie normal et de la référence ne fuit pas. Comme vous l'avez mentionné, le laisser dans le constructeur sans aucun moyen de l'enlever serait considéré comme une fuite.

+0

Merci de votre réponse. Donc vous suggérez quelque chose comme créer des méthodes register (Fragment f) {mFragment = f; } et unregister() {mFragment = null} dans Loader et appelez ces méthodes dans onAttach()/onDetach() pour éviter les fuites? – traninho

+0

Oui, quelque chose comme ça, bien que je le rende probablement plus générique et transmette une interface que le 'Fragment' pourrait implémenter. Fondamentalement, la même API que 'OnLoadCompleteListener' et 'OnLoadCanceledListener' que' Loader' a déjà ... – Devunwired

Questions connexes