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;
    }

}
InformationsquelleAutor Keeb13r | 2010-12-02
Schreibe einen Kommentar