HTTP REQUEST ausführen

  • 11 Antworten
  • Letztes Antwortdatum
S

Sascha_K1994

Stamm-User
83
Guten Abend allerseits,

ich bin noch nicht ganz so erfahren auf dem Android - Programmiergebiet, meine Künste liegen eher in PHP & Co.

Ich verwende folgendes um einen GET Request zu senden:

Code:
final getDaten userd = new getDaten();
String serveranswer = userd.getDatenvonURL("URL.de/url.php?url=1");

if(serveranswer.equals("OK")){
    <mache weiter>
}
und dazu in einer eigenen Class:
Code:
    String url = "";
    String params = "";
    getJSON context = this;
    String jsonResponse;
    int wartedurchlauf = 0;
    int antwortbekommen = 0;
    
    public String getJSONforURL(String urlparams){        
    
        params = urlparams;
        Log.v("[APP] ", "Starte Anfrage an Server  ...");
        checkUpdate.start();       
        
        while(checkUpdate.isAlive()){
            try {
                synchronized(this) {
                    if(wartedurchlauf > 500) {
                        Log.v("[APP] ", "Keine Antwort vom Server erhalten.");
                        return "ERROR";
                    }else{
                        wait(100);
                        if (antwortbekommen == 0){
                            Log.v("[APP] ", "Warte auf Antwort vom Server ...");
                            wartedurchlauf++;
                        }
                    }
                }
            } catch (InterruptedException e) {
            }
        }

        return Response;
    }
        
    private Thread checkUpdate = new Thread() {
        public void run() {
            try {
               URL updateURL = new URL(params);
                URLConnection conn = updateURL.openConnection();
                InputStream is = conn.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                ByteArrayBuffer baf = new ByteArrayBuffer(50);

                int current = 0;
                while((current = bis.read()) != -1){
                    baf.append((byte)current);
                }
                Response = new String(new String(baf.toByteArray()));
                
                Log.v("[APP] ", "Antwort vom Server erhalten.");
                antwortbekommen = 1;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
Generell klappt dieser Code auch nur das Problem ist, das sich das Handy wärend des Ladens (wenn es zB 5 Sekunden dauert) aufhängt, das heißt klickt man irgendwo auf dem Bildschirm kommt die bekannte "... reagiert nicht" - Meldung!

Dann habe ich dieses schöne hier gefunden (klappt wunderbar und der Ladebalken ist ebenfalls richtig toll :) )
GetXMLTask task = new GetXMLTask();
task.execute(new String[] { URL });

dazu in der gleichen Class:
Code:
    private class GetXMLTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {
            String output = null;
            for (String url : urls) {
                output = getOutputFromUrl(url);
            }
            return output;
        }
 
        private String getOutputFromUrl(String url) {
            StringBuffer output = new StringBuffer("");
            try {
                InputStream stream = getHttpConnection(url);
                BufferedReader buffer = new BufferedReader(
                        new InputStreamReader(stream));
                String s = "";
                while ((s = buffer.readLine()) != null)
                    output.append(s);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return output.toString();
        }
 
        // Makes HttpURLConnection and returns InputStream
        private InputStream getHttpConnection(String urlString) throws IOException {
            InputStream stream = null;
            URL url = new URL(urlString);
            URLConnection connection = url.openConnection();
 
            try {
                HttpURLConnection httpConnection = (HttpURLConnection) connection;
                httpConnection.setRequestMethod("GET");
                httpConnection.connect();
 
                if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    stream = httpConnection.getInputStream();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return stream;
        }
        
        ProgressDialog mProgressDialog; 
        
        protected void onPreExecute() {
            mProgressDialog = ProgressDialog.show(MainActivity.this, "Bitte warten ...", "Daten werden geladen ...");
        }
 
        protected void onPostExecute(String output) {
            mProgressDialog.dismiss();
            outputText.setText(output);
        }
    }
nur das Problem ist das er die Serverantwort direkt ausgibt (in ein TextView), was ich aber gar nicht will (sondern in eine Variable). Kann man das irgendwie abändern? Herzlichen Dank.
 
Hallo,
du schreibst alles bereits in eine String variable (output),
wenn du nur verhindern willst das es angezeigt wird must du die outputText.setText(output); aus dem onPostExecute löschen.
 
Danke nur wenn ich dann eine if-Bedingung mache geht Er da vorher rein bevor Er erstmal den Request bearbeitet hat und dadurch funktioniert dies nicht richtig.

Würde jetzt gerne ein Beispiel machen nur bin unterwegs, meine das ungefähr so das ich das Resultat wieder in einen String bekomme, wie String result = getXMLTask (URL)

Gesendet von meinem Xperia S mit der Android-Hilfe.de App
 
String output=task.execute(new String[] { URL });
 
Danke nur das hatte ich versucht da kam das onPostExecute nicht String zurückgeben kann :confused:

Gesendet von meinem Xperia S mit der Android-Hilfe.de App
 
den mach aus output ne Globale variable.
 
Maddi schrieb:
den mach aus output ne Globale variable.

Und dann kommt das beschriebene Problem.

Wenn ich mache:

Code:
public String outputserver = null;

<CODE>

GetXMLTask task = new GetXMLTask();
        task.execute(new String[] { "http://seite.de" }); 			 		

if(outputserver.equals("Ja")){
   <mache weiter>
}

<CODE>

protected void onPostExecute(String output) {
            mProgressDialog.dismiss();
            outputserver = output;
        }

Macht er die if-bedingung schon, obwohl noch gar keine Antwort von der Seite vorliegt.
 
Das ist ja der Zweck beim AsyncTask,
das nicht auf das Fertigwerden gewartet werden muss.
 
Maddi schrieb:
Das ist ja der Zweck beim AsyncTask,
das nicht auf das Fertigwerden gewartet werden muss.

Das habe ich mir auch gedacht, nur wie bekomme ich dann hin, das ich mit den erhaltenen Daten weiter "auswerten" kann?
 
Kannst du das weiterverarbeiten nicht gleich im asynctask machen und dann nur mit das Ergebnis Anzeigen lassen?

Gesendet von meinem GT-S5660 mit der Android-Hilfe.de App
 
Oh man ich hatte ja Tomaten auf den Augen. Ich kann in "onPostExecute" ja eine neue Methode aufrufen mit dem String output :scared: Wieso komme ich da jetzt erst drauf. Werden dann zwar mehrere Methoden aber läuft perfekt.

Danke an eure Hilfe :laugh:
 
Eine Frage habe ich doch noch ...

Wenn die Methode nun keine Antwort bekommt oder sonstiges, dann stürzt diese ab.

Kann ich das irgendwie unterbinden?!

Gesendet von meinem Xperia S mit der Android-Hilfe.de App
 
Zurück
Oben Unten