Mon activité charge un fragment et démarre une asyncTask. Cet asynctask dans l'activité charge des données (que je stocke dans le contexte). Quand il se termine comment puis-je recharger l'interface utilisateur en fragment pour afficher les données chargées (dans l'activité parente)?Lorsque asynctask en activité se termine comment recharger ui en fragment?
Répondre
Le onPostExecute fonctionne déjà dans le UIThread, vous avez juste besoin de votre fragment d'appeler votre activité. La façon dont je le fais habituellement est en définissant une interface pour le fragment. Comme ceci:
public interface YourFragmentListener {
void onParksLoaded(List<String> names)
}
ensuite sur votre activité:
public class YourActivity implements YourFragmentListener {
@Override
void onParksLoaded(List<String names) {
// Do something with the names
yourField.setText(names.get(0))
}
}
Enfin dans votre fragment vous pouvez l'utiliser comme ceci:
@Override
protected void onPostExecute(String value) {
((YourFragmentListener) getActivity()).onParksLoaded(value)
}
Bien sûr, vous pouvez modifier les types de mieux adapter votre cas d'utilisation. Méfiez-vous de la distribution, si vous utilisez ce fragment dans une activité qui n'implémente pas YourFragmentListener, elle lèvera une exception
lorsque vous avez créé le fragment que vous avez une instance de lui donc ce que vous pouvez faire est onPostExecute pour appeler la méthode sur votre fragment
@Override
protected void onPostExecute(String value) {
yourFragment.doSomething()
}
Je ne peux pas faire cela car je ne peux pas appeler une méthode non statique depuis onPostExecute (getView() et getContext() sont des méthodes non statiques). et J'ai une autre tâche dans cette méthode qui ne peut pas être chargée. –
pourquoi pas? la tâche asynchrone située dans votre classe? – Yoni
le deuxième asynctask est situé dans le fragment, pour charger une image à partir d'une URL sur un ImageView –
Définir votre méthode souhaitée dans le fragment de mettre à jour l'interface utilisateur, lorsque async travail est fait, la recherche de fragment dans l'activité mère et appeler la méthode sur l'instance fragment
MyFragment:
public void refreshUI(String data) {
//Do something with data you receive
}
ParentActivity:
@Override
protected void onPostExecute(String value) {
//or you can find it with tag if have any
MyFragment frag = getFragmentManager().findFragmentById(R.id.container);
if(frag != null) frag.refreshUI(value);
}
fonctionne comme un charme, merci –