Android-Probleme mit AsyncTask und InputStream

Ich habe schon eine ganze Weile versucht, das selbst herauszufinden. Durch Versuch / Irrtum und Recherche, aber ich kann es einfach nicht herausfinden. Ich bin ziemlich schlecht mit Async und Netzwerkverbindungen und viel, also könnte es etwas Einfaches sein, das ich überblicke. Wie auch immer ... Ich werde einige relevante Codebeispiele und Erklärungen einfügen.

Schneller Hintergrund meines Problems. Ich arbeite mit der Rotten Tomatoes API für meine App und verwende GSON zum Parsen ihrer Daten. Ich habe anfangs auf 2.3 abgezielt, und das hat gut funktioniert. Dann entschied ich mich für die Unterstützung von ICS und stieß natürlich auf den "no network operation on the UI thread" - also fing ich an, mich mit AsyncTask zu befassen.

Hier ist meine InputStream-Methode:

private InputStream retrieveStream(String url) {

    DefaultHttpClient client = new DefaultHttpClient();

    HttpGet getRequest = new HttpGet(url);

    try {

        HttpResponse getResponse = client.execute(getRequest);
        final int statusCode = getResponse.getStatusLine().getStatusCode();

        if (statusCode != HttpStatus.SC_OK) {
            Log.w(getClass().getSimpleName(),
                    "Error " + statusCode + " for URL " + url);
            return null;
        }

        HttpEntity getResponseEntity = getResponse.getEntity();
        return getResponseEntity.getContent();
    }
    catch (IOException e) {
        getRequest.abort();
        Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
    }

    return null;
}

Was in meiner Hauptaktivität gut funktioniert hat und mir jetzt Probleme bereitet, wenn ich versuche, es in AsyncTask zu konvertieren. Ich habe es so genannt:

InputStream source = retrieveStream( url parameter );

Dann habe ich versucht, diese Methode in meine AsyncTask-Klasse zu verschieben und sie folgendermaßen aufzurufen:

private PerformMovieSearch performSearch = new PerformMovieSearch(this);
InputStream source = performSearch.retrieveStream(movieQueryUrl);

Aber das reicht nicht aus, trotzdem wird der Fehler beim Ausführen von Netzwerkaktionen auf der Benutzeroberfläche angezeigt. Was ich herausfinden muss, ist, wie ich 'retrieveStream' von der AsyncTask aus aufrufen kann, denke ich. Derzeit sieht diese Klasse so aus:

package net.neonlotus.ucritic;

[imports]

public class PerformMovieSearch extends AsyncTask<String, Void, String> {

private final Context context;
private ProgressDialog progressDialog;


public PerformMovieSearch(Context context){
    this.context = context;
}


@Override
protected String doInBackground(String... urls) {
    retrieveStream(urls[0]);

    return null;

}

@Override
protected void onPreExecute() {
    progressDialog= ProgressDialog.show(context, "Please Wait","Searching movies", true);

}


@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    progressDialog.dismiss();

    MyActivity.mListAdapter.notifyDataSetChanged();
}

public InputStream retrieveStream(String url) {

    DefaultHttpClient client = new DefaultHttpClient();
    HttpGet getRequest = new HttpGet(url);

    try {
        HttpResponse getResponse = client.execute(getRequest);
        final int statusCode = getResponse.getStatusLine().getStatusCode();

        if (statusCode != HttpStatus.SC_OK) {
            Log.w(getClass().getSimpleName(),
                    "Error " + statusCode + " for URL " + url);
            return null;
        }

        HttpEntity getResponseEntity = getResponse.getEntity();
        return getResponseEntity.getContent();
    } catch (IOException e) {
        getRequest.abort();
        Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
    }

    return null;
}

}

Der "doinbackground" ist das, was geändert werden muss ... aber ich finde anscheinend keinen direkten Weg, um das richtig zum Laufen zu bringen. Ich habe mit ausgeführt

new PerformMovieSearch(this).execute(movieQueryUrl);

Ich weiß, dass das eine Menge Dinge sind, die möglicherweise verwirrend sind ... aber wenn jemand weiß, wie man die retrieveStream-Methode im Wesentlichen asynchron ausführt, wäre das großartig. Wie ich schon sagte, ich habe viele Dinge ausprobiert, viel recherchiert und konnte mir nichts Nützliches einfallen lassen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage