J'essaie d'utiliser une classe AsyncTask-extended pour gérer la connexion à une URL, analyser JSON, afficher un ProgressDialog indéterminé pendant l'analyse et retourner les résultats en tant que valeur-clé paires dans une HashMap à l'activité principale. Les résultats du HashMap seront alors lus par l'activité principale et mis dans des champs de formulaire. Cependant, même si je remplis le HashMap dans mon AsyncTask (attesté par les instructions println), appeler une méthode dans l'activité principale qui retourne le HashMap donne un résultat vide. Je ne peux pas comprendre si c'est quelque chose que je fais mal, ou si je ne comprends pas les capacités d'AsyncTask.Android - résultat d'AsyncTask n'étant pas retourné à l'activité principale
Je discute de la conversion de ma classe qui étend AsyncTask à une activité. Essentiellement, l'utilisateur ne devrait pas pouvoir faire autre chose pendant cette recherche/analyse de données et devrait attendre jusqu'à ce que ProgressDialog s'en aille avant qu'il puisse à nouveau interagir avec l'application (ou en appuyant sur le bouton de retour). De plus, mon application doit pouvoir gérer certains cas dans mon AsyncTask où les exceptions sont interceptées (impossible de se connecter à l'URL, JSON incorrect, l'ID du produit à rechercher est introuvable) et les boîtes de dialogue d'erreur personnalisées sont adaptées à ces exceptions. Je pourrais facilement faire ceci si cette classe était une activité, car je pourrais renvoyer différents codes de résultat en appelant finish(), selon si une exception est attrapée. Encore une fois, je ne suis pas sûr si AsyncTask est la meilleure solution ici, puisque l'utilisateur ne fera rien d'autre pendant que l'information est recueillie et analysée. Veuillez me dire si une nouvelle activité aurait du sens ou si je ne faisais que modifier ma mise en place d'un fil rouge.
MainActivity.java
mInitiateProductLookupButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
ProductLookup pl = new ProductLookup(id, MainActivity.this);
pl.execute();
// The below variable is always empty!
HashMap<String, String> productInfo = pl.getProductInfo();
applyProductInfoToFormFields(productInfo);
}
});
ProductLookup.java
public class ProductLookup extends AsyncTask<Object, Void, HashMap<String, String>> {
private String mProductID;
private Context mContext;
HashMap<String, String> mProductInfo;
ProgressDialog mDialog;
public ProductLookup(String id, Context applicationContext) {
mProductID = id;
mContext = applicationContext;
mProductInfo = new HashMap<String, String>();
}
@Override
protected void onPreExecute() {
mDialog = new ProgressDialog(mContext);
mDialog.setMessage("Loading product info. Please wait...");
mDialog.setIndeterminate(true);
mDialog.setCancelable(false);
mDialog.show();
}
@Override
protected void onPostExecute(HashMap<String, String> result){
super.onPostExecute(result);
mDialog.dismiss();
mProductInfo = result;
}
@Override
protected HashMap<String, String> doInBackground(Object... params) {
try {
// Connect to URL, parse JSON, and add key-value pairs to mProductInfo...
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
finally {
try {
// Close input/output reader variables
} catch (IOException e) {
e.printStackTrace();
}
}
return mProductInfo;
}
public HashMap<String, String> getProductInfo(){
return this.mProductInfo;
}
}
Lorsque je tente de le faire, je reçois une erreur qui ne me laisse pas compiler: « Pas instance englobante du MainActivity de type est accessible portée » – Keeb13r
Créer l'AsyncTask à l'intérieur de votre MainActivity comme enfant classe privée . – Pentium10
Comment créez-vous exactement une classe privée enfant? – Keeb13r