Android - Ergebnis von AsyncTask nicht wieder zu Haupttätigkeit
Ich versuche, ein AsyncTask-erweiterte Klasse zu behandeln Anschluss an eine URL Parsen von JSON-Darstellung eines unbestimmten ProgressDialog während der Analyse, und die Rückgabe der Ergebnisse als Schlüssel-Wert-Paare in eine HashMap zu den wichtigsten Aktivitäten. Die Ergebnisse der HashMap wird dann gelesen werden, die von der Haupt-Activity und setzen Sie in die Formularfelder. Jedoch, obwohl ich mich dem füllen der HashMap in meinem AsyncTask (belegt durch die println-Anweisungen) durch den Aufruf einer Methode in der main-Activity liefert, dass die HashMap ergibt ein leeres Ergebnis. Ich kann nicht herausfinden, ob dies ist etwas, was ich falsch mache, oder ob ich verkennen die Fähigkeiten von AsyncTask.
Ich bin debattieren die Konvertierung meiner Klasse extends AsyncTask zu einer Aktivität. Im wesentlichen sollte der Benutzer nicht in der Lage sein, irgendetwas anderes zu tun während dieser Datenrecherche/- Analyse und sollte warten, bis der ProgressDialog geht Weg, bevor Sie mit der Anwendung interagieren wieder (oder durch drücken der zurück-Taste). Auch meine Anwendung muss in der Lage sein, die sich mit bestimmten Fällen, die in meinem AsyncTask in denen exceptions gefangen werden (kann keine Verbindung zur URL, bad JSON, Produkt-ID-Suche nicht gefunden werden können) und benutzerdefinierte Fehler-Dialoge sind speziell für diese Ausnahmen. Ich konnte einfach das machen, wenn diese Klasse war eine Tätigkeit, wie konnte ich zurück schicken, anderes Ergebnis-codes beim Aufruf finish(), abhängig davon, ob eine exception gefangen wurde.
Wieder, ich bin mir nicht sicher, ob AsyncTask ist hier die beste Lösung, da der Benutzer nicht etwas anderes zu tun, während die Informationen gesammelt und analysiert. Bitte informieren Sie mich, wenn eine neue Tätigkeit einen Sinn machen würde oder wenn ich mich gerade mangeln, meine Umsetzung von einem hintergrund-thread.
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;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
.execute()
ausgeführt Gewinde und nicht auf das Ergebnis zu warten.Also, was auch immer Sie nennen, nach diesem es, ist leer, wenn die Daten nicht geladen wurden, noch.
Müssen Sie auf PostExecuted das Ergebnis direkt an Ihre Aktivität über eine setter -
MainActivity.this.setProductInfo(result)
setProductInfo(result)
zwischen der Kind-Klasse und der äußeren Klasse. setProductInfo werden kann, eine Methode, die auch in der untergeordneten Klasse.Classname.this
Gibt es einige verpassen Konzept für Sie. Die Aussage nach dem AsyncTask.execute() ausgeführt werden, die direkt nach dem Aufruf. Während Ihrer doInBackground ist die Durchführung in anderen thread. Hier, wenn Sie mit productInfo Karte, die doInBackground war nicht abgeschlossen, so das Ergebnis wird nicht aufgefüllt, es
Einfache Lösung für Sie ist zu verwenden das Ergebnis in der onPostExecute-Methode.