HTTP Request mit Post als eigene Klasse

  • Antworten:5
Laire
  • Forum-Beiträge: 71

04.08.2014, 04:41:12 via Website

Hallo,

ich muss in meiner App in verschiedenen Activitys immer wieder auf die gleiche HTTP Schnittelle zugreifen.

Im Moment mache ich es so, das ich in jede Activity einen Klasse eintrage und im onPostExecute dann darauf je nach Aktivity reagiere, hier ein Beispiel zum Login.

    public class getPost extends AsyncTask<List<NameValuePair>, Void, String> {
    String      line;
    String      returnPost  = "";
    InputStream inputStream;

    @Override
    protected String doInBackground(List<NameValuePair>... params){
        HttpClient httpclient  = new DefaultHttpClient();
        HttpPost httppost    = new HttpPost("http://resper.de/skfband.php");
        try {
            httppost.setEntity(new UrlEncodedFormEntity(params[0]));
            HttpResponse loginResult = httpclient.execute(httppost);
            inputStream = loginResult.getEntity().getContent();
            BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
            while((line = bufferedReader.readLine()) != null){
                returnPost += line;
            }
            inputStream.close();
        } catch (ClientProtocolException e) {
            Log.d("Debug","Debug");
        } catch (IOException e) {
            Log.d("Debug","Debug");
        }

        return returnPost;
    }

    protected void onPostExecute(String result) {
        // Ergebnis auswerten und dementsprechend reagieren
    }
}

Ist es möglich eine eigene Klasse zu erstellen, die ich dann mit denn Parameter übergebe und ich als return den den String bekomme?

z.B.:

 GetPost getResult = new GetPost ();
 String resultString = getResult.getPostPairs(pairs);

Ich habe es so probiert, aber da bekomme ich den android.os.NetworkOnMainThreadException Fehler, da ich das ganze ja als AsyncTask ausführen muss.

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

public class GetPost {

    public GetPost() {

    }

    public String getPostPairs(List<NameValuePair> pairs) {
        String result = null;

        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost("http://resper.de/skfband.php");
            httpPost.setEntity(new UrlEncodedFormEntity(pairs));
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            result = EntityUtils.toString(httpEntity);
        }catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }
}

Antworten
JustinTime
  • Forum-Beiträge: 21

04.08.2014, 09:00:27 via Website

Das wäre ein gutes Anwendungsszenario für Eventbus.

Damit kannst du in der Activity oder dem Fragment das auf die Antwort wartet einen Listener definieren der auf ein Event wartet (in deinem Fall eben die Daten aus dem HTTP Request). Dann kannst du in deiner HTTP Klasse ein Event absenden und alle Klassen die auf dieses Event warten und aktiv sind werden getriggert.

Einfach mal reinschauen bei github.com/greenrobot/EventBus

Ich benutze das ganze weil ich ein ähnliches Szenario habe. Ich habe eine Klasse die eine Website lädt, parsed und in Verschiedene Datenblöcke zerlegt. Dann sendet sie für die Datenblöcke (3 verschiedene) individuelle Events und meine einzelnen Fragmente reagieren dann darauf.

Vorteil davon ist das ich die Fragmente wild ändern kann, entfernen, verschieben ohne das sich die Übergabelogik ändert. Man muss nicht mit irgendwelchen Listenern oder Interfaces rummachen etc. Alles wunderbar einfach und effizient.

Außerdem müsstest du das ganze halt wirklich aus dem UI Thread auslagern. Also in einen Asynctask wenn es sein muss oder besser in einen Volley, ION oder was auch immer Request.

— geändert am 04.08.2014, 09:21:46

Antworten
Sven R.
  • Forum-Beiträge: 1.904

04.08.2014, 11:45:56 via App

Wie schon gesagt, führt meines Wissens nach, kein Weg an Callbacks vorbei.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.08.2014, 12:00:27 via App

Zudem sind Callbacks relativ nützlich und einfach zu imlementieten.

— geändert am 04.08.2014, 12:00:41

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
JustinTime
  • Forum-Beiträge: 21

04.08.2014, 12:24:59 via Website

Es geht schon ohne Callbacks und spart einige Zeilen wiederkehrenden Code. Muss man halt wissen wie es einem lieber ist.

Antworten
Laire
  • Forum-Beiträge: 71

04.08.2014, 14:06:27 via Website

Ok hatte nen Brett vorm Kopf, kann ja den HTTP Request trotzdem in eine eigenen Klasse auslagern und dann diese in einem AsyncTask aufrufen, somit hat sie der Code schon etwas gesäubert...

Antworten