httpclient.execute() blockiert GUI

  • Antworten:2
Özhan Kaya
  • Forum-Beiträge: 2

21.07.2012, 17:10:44 via Website

Hallo miteinander
Ich habe mich in den letzen 2 - 3 Wochen mit der Android App Entwicklung befasst und bisher konnte jedes Problem mit einer intensiven Google Suche gelöst werden. Bis auf dieses.

Infos zum Programm:
Das Programm dient eigentlich dazu, dass ein Text welcher im EditText Feld eingegeben wird an ein PHP Script übergeben wird. Dieser PHP Script durchsucht eine MYSQL Datenbank nach folgendem Text in einer bestimmten MYSQL Tabelle und liefert einige Resultate dieser Tabellenreihe mittels eines JSON Objekts zurück. Das Programm wiederum liesst das JSON Objekt ein und fischt die einzelnen Daten raus.

Problem:
Generell funktioniert alles. Wie zu sehen ist, habe ich die Wartezeit der Anfrage auf 10 Sekunden gestellt und somit wartet der HTTPClient maximal 10 Sekunden auf ein Resultat vom Server, bevor er aufgibt. Jedoch ist während dieser Wartezeit von 10 Sekunden das ganze GUI blockiert, sprich der Benutzer kann keine Buttons betätigen usw.
Ich habe einige Versuche mit Threads und dem AsyncTask durchgeführt, jedoch kam ich mit keinem Lösungsansatz weiter.

Programmcode
[code]package fizzzo.thenewboston.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
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.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MYSQL extends Activity implements OnClickListener
{
TextView tv_Result;
EditText et_Input;
static boolean work = false;

@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mysql);
Button b_Get = (Button) findViewById(R.id.bMYSQL);
Button b_Rand = (Button) findViewById(R.id.bMYSQLRand);
tv_Result = (TextView) findViewById(R.id.tvMYSQL);
et_Input = (EditText) findViewById(R.id.etMYSQL);
b_Get.setOnClickListener(this);
b_Rand.setOnClickListener(this);
}

public void onClick(View v)
{
String[] Posts = { "login", et_Input.getText().toString() };

try
{
JSONObject ResultJSON = getJSONFromMYSQL(
"http://54.45.12.245/teste.php", Posts);

if (ResultJSON.getInt("worked") != 0)
{
switch (v.getId())
{
case R.id.bMYSQL:
tv_Result.setText(ResultJSON.getString("email"));
break;
case R.id.bMYSQLRand:
tv_Result.setText(ResultJSON.getString("random"));
break;
}
} else
{
tv_Result.setText("Didn't work");
}

} catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public JSONObject getJSONFromMYSQL(String URL, String[] POSTvars)
{
JSONObject ob = new JSONObject();
try
{
ob.put("worked", 0);
} catch (JSONException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}

HttpPost httppost = new HttpPost(URL);

// HTTP Parameter Variable erstellen
HttpParams HttpParameter = new BasicHttpParams();

// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
HttpConnectionParams.setConnectionTimeout(HttpParameter, 10000);

// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
HttpConnectionParams.setSoTimeout(HttpParameter, 2000);

// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient(HttpParameter);

// http://stackoverflow.com/questions/693997/how-to-set-httpresponse-timeout-for-android-in-java

try
{

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
POSTvars.length / 2);
for (int i = 0; i < POSTvars.length / 2; i += 2)
{
nameValuePairs.add(new BasicNameValuePair(POSTvars[i],
POSTvars[i + 1]));
}

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

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

if (response.getStatusLine().getStatusCode() == 200)
{
String sLine = "";
StringBuilder sbResult = new StringBuilder();

// Wrap a BufferedReader around the InputStream
BufferedReader rd = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));

// Read response until the end
while ((sLine = rd.readLine()) != null)
{
sbResult.append(sLine);
}

// StringBuilder contains JSON Result from PHP Script
JSONObject json = new JSONObject(sbResult.toString());

return json;
}

} catch (ClientProtocolException e)
{
// TODO Auto-generated catch block
Toast.makeText(this, "1", Toast.LENGTH_SHORT).show();
} catch (IOException e)
{
Toast.makeText(this, "2", Toast.LENGTH_SHORT).show();
// TODO Auto-generated catch block
} catch (JSONException e)
{
Toast.makeText(this, "3", Toast.LENGTH_SHORT).show();
// TODO Auto-generated catch block
e.printStackTrace();
}

return ob;
}

}
[/code]

(IP Adresse wurde verändert)
Uses Permissions in der AndroidManifest Datei sind eingestellt.


Danke im Voraus für die freundliche Hilfe ;)

Fizzzo

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

21.07.2012, 17:31:23 via Website

1) gehört das wohl eher ins entwickler forum

2) sämtliche netzwerk operationen gehören in einen thread. ab honeycomb stürtzt deine app so generell ab.

swordiApps Blog - Website

Antworten
Özhan Kaya
  • Forum-Beiträge: 2

21.07.2012, 19:08:00 via Website

Danke für die schnelle Antwort und sry wegen der falschen Kategorie.

Hab das Problem nun mit dem AsyncTask gelöst. Jedoch musste ich ein Default JSON Objekt erstellen, welcher zurückgegeben wird, falls kein JSON Objekt vom Server gefunden werden konnte.

Thread kann gelöscht werden.
Werde in Zukunft meine Threads (Forumthreads) richtig platzieren ;)

Antworten