2012-03-31 11 views
2

Ich benutze eine Anwendung, wo ich nur ein paar Koordinaten für Google Maps von einem MySQL-Server herunterladen müssen. Ich kann dies erfolgreich mit PHP und einem normalen httpost, aber meine App friert für ein paar Sekunden, wenn ich es mache.Async HTTP Post-Android

Ich lese, dass Sie httppost asycronous machen müssen, um das Einfrieren zu vermeiden, bis der Server das Prossess beendet und die Ergebnisse sendet.

Der Punkt ist, dass ich brauche, dass Ergebnisse in einem JSON-Array wie der normale httpost ergibt.

Zum Beispiel, wenn ich diese httppost hatte.

HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php"); 

try { 
    // Add your data 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
    nameValuePairs.add(new BasicNameValuePair("id", "12345")); 
    nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!")); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    // Execute HTTP Post Request 
    HttpResponse response = httpclient.execute(httppost); 
} catch (ClientProtocolException e) { 
    // TODO Auto-generated catch block 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
} 

String result11 = null; 
// convert response to string 
try { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is11, "iso-8859-1"), 8); 
    StringBuilder sb = new StringBuilder(); 
    sb.append(reader.readLine() + "\n"); 
    String line = "0"; 
    while ((line = reader.readLine()) != null) { 
     sb.append(line + "\n"); 
    } 
    is11.close(); 
    result11 = sb.toString(); 
} catch (Exception e) { 
    Log.e("log_tag", "Error converting result " + e.toString()); 
} 

// parsing data 
try { 
    JSONArray jArray1 = new JSONArray(result11); 
} catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Wie kann ich das zu einem asynchronen Beitrag umwandeln, damit ich den Einfrieren vermeiden kann?

+0

Ich habe keine Ahnung, wie Ihr Code könnte sogar kompilieren, wie es ist, aber bitte verwenden [ 'EntityUtils.toString (response.getEntity())'] (http://stackoverflow.com/a/2324739/180740) anstelle einer eigenen BufferedReader-n-StringBuilder-Partei. Ersteres ist weniger Code, hat eine korrekte Fehlerbehandlung und gehorcht der Zeichencodierung, die vom Server gesendet wird. –

Antwort

1

Vorausgesetzt, dass Sie diese auf einer Schaltfläche klicken tun:

public void onClick(View v) { 
    new Thread(new Runnable() { 
     public void run() { 
      //your code here 
     } 
    }).start(); 
} 

Grundsätzlich Sie IO intensiven Betrieb in einem separaten Thread setzen (nicht Ihr UI-Thread), so dass der UI nicht gefriert.

+0

versuchen Sie in einer Weile und krank antworten Sie. Vielen Dank für Ihre Antwort :) – user878813

2

Anstatt nur einen neuen Thread zu starten, ist es eine bessere Idee, mit einer vollwertigen AsyncTask zu gehen. Es bietet viel mehr Kontrolle über die Dinge.

private class DoPostRequestAsync extends AsyncTask<URL, Void, String> { 
    protected String doInBackground(URL url) { 
     //Your download code here; work with the url parameter and then return the result 
     //which if I remember correctly from your code, is a string. 
     //This gets called and runs ON ANOTHER thread 
    } 

    protected void onPostExecute(String result) { 
     //This gets called on the interface (main) thread! 
     showDialog("Done! " + result); 
    } 
} 

Platzieren Sie die neue Klassenimplementierung in die gewünschte Aktivitätsklasse. Für weitere Informationen über AsyncTask folgen Sie bitte diesem Link:

http://developer.android.com/reference/android/os/AsyncTask.html

5

Es gibt eine nette Klasse AsyncTask, die leicht verwendet werden kann, um asynchrone Aufgaben auszuführen. Wenn Sie Ihren Code in einer solchen Unterklasse einbetten, können Sie mit diesem Ende:

public class FetchTask extends AsyncTask<Void, Void, JSONArray> { 
    @Override 
    protected JSONArray doInBackground(Void... params) { 
     try { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php"); 

      // Add your data 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("id", "12345")); 
      nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!")); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      // Execute HTTP Post Request 
      HttpResponse response = httpclient.execute(httppost); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      sb.append(reader.readLine() + "\n"); 
      String line = "0"; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      reader.close(); 
      String result11 = sb.toString(); 

      // parsing data 
      return new JSONArray(result11); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(JSONArray result) { 
     if (result != null) { 
      // do something 
     } else { 
      // error occured 
     } 
    } 
} 

Sie können die Aufgabe beginnen:

new FetchTask().execute(); 

Zusätzliche Ressourcen:

3

Ich empfehle die Verwendung von android-async-http (http://loopj.com/android-async-http/) Bibliothek. Es macht Android async http Aufrufe einfach und elegant.

+1

Leider gibt es nur wenige Demos, die es einem Neuling einfacher machen, alles zusammen zu stellen, wie in diesem Fall, um Daten an eine URL zu senden und eine Antwort mit JSON zu verarbeiten. Ich verstehe, es ist alles da und scheint sehr mächtig und schlau zu sein, aber ein paar mehr Beispiele würden definitiv helfen. – richey

+1

Ich habe es benutzt und fand es einfach, mit zu beginnen. Ich habe mit dem Codebeispiel in "Empfohlene Verwendung" in http://loopj.com/android-async-http/ begonnen. Ich würde lernen und bestimmte Dinge auf dem Weg machen, wie zum Beispiel die Cookies beibehalten, es mit SSL (vertrauenswürdig und nicht vertrauenswürdig) arbeiten lassen, einen Check hinzufügen, um zu sehen, ob das Gerät online ist oder nicht usw. Ich fühle all diese Probleme muss behandelt werden, ob Sie diese Bibliothek oder Android API verwenden. – krishnakumarp

1

Verwenden Sie eine asynchrone http-Bibliothek wie ion. https://github.com/koush/ion

Alle Threading- und asynchronen Voreinstellungen werden für Sie abgewickelt.

Dies ist Ihr gleicher Code, asynchron, mit Ion. Viel einfacher:

Ion.with(context) 
.load("http://www.yoursite.com/script.php") 
.setBodyParameter("id", "12345") 
.setBodyParameter("stringdata", "AndDev is Cool!") 
.asJsonArray() 
.setCallback(new FutureCallback<JsonArray> { 
    void onCompleted(Exception e, JsonArray result) { 
    // do something with the result/exception 
    } 
}); 
Verwandte Themen