AsyncTask et Contextes
Donc j'ai fais ma première application multi-thread à l'aide de Android avec la classe AsyncTask. Je suis en train de l'utiliser pour déclencher un Géocodeur dans un deuxième fil, puis mise à jour de l'INTERFACE utilisateur avec onPostExecute, mais je continue à courir dans un problème avec le bon Contexte.
Je entravé mon chemin à travers à l'aide des Contextes sur le thread principal, mais je ne suis pas exactement sûr de ce que le Contexte est ou comment l'utiliser sur les threads d'arrière-plan, et je n'ai pas trouvé de bons exemples sur elle. Toute aide? Voici un extrait de ce que je suis en train de faire:
public class GeoCode extends AsyncTask<GeoThread, Void, GeoThread> {
@Override
protected GeoThread doInBackground(GeoThread... i) {
List<Address> addresses = null;
Geocoder geoCode = null;
geoCode = new Geocoder(null); //Expects at minimum Geocoder(Context context);
addresses = geoCode.getFromLocation(GoldenHour.lat, GoldenHour.lng, 1);
}
}
Il met en situation d'échec, à la sixième ligne, en raison de la mauvaise Contexte.
Vous devez vous connecter pour publier un commentaire.
@Eugène van der Merwe
Le morceau de code suivant fonctionne pour moi : ) -->
Acclamations,
Ready4Android
AsyncTask
est un intérieur de classe (non statique), il a référence implicite à l'enfermantActivity
. Cela crée de fuite de mémoire, même si vous ne passez pasContext
à tous. Par conséquent,WeakReference
ne résoudra pas le problème!Le Contexte est un objet qui donne accès à l'application de l'environnement d'exécution. Dans la plupart des cas lorsque vous avez besoin pour obtenir des objets à partir de Android à l'environnement, comme les ressources, les points de vue, de l'infrastructure classes, etc -- vous devez avoir dans vos mains.
Pour obtenir une instance de Contexte est très simple, quand vous êtes dans la classe d'Activité -- Activité elle-même est une sous-classe du Contexte, de sorte que tous vous avez besoin à faire est d'utiliser 'ce' mot-clé le point sur votre contexte actuel.
Qu'à vous créer un code qui pourrait avoir besoin de Contexte, vous devez prendre soin de transmettre du Contexte de l'objet de votre Activité parent. Dans le cas de votre exemple, vous pouvez ajouter explicite constructeur qui accepte Contexte comme argument d'entrée.
J'ai fait un peu plus de recherche, et quelqu'un a suggéré de passage pour le fil (je ne sais pas pourquoi je n'avais pas pensé à ça). J'ai réussi à le Geocoder fil par le biais d'un argument, et juste comme ça, ça a fonctionné.
Le problème avec la mise à jour de l'INTERFACE utilisateur à partir d'un AsyncTask est que vous avez besoin de la actuel contexte d'activité. Mais le contexte est détruit et recréé à chaque changement d'orientation.
Voici une bonne réponse à votre question: Android AsyncTask comportement de contexte
Si ne regarde pas comme vous utilisez les paramètres. Vous pourriez l'utiliser pour passer dans le Conetxt.
Puis de l'intérieur de votre activité: