mehrere DefaultHTTPClients zur gleichen Zeit

T

TiJay

Neues Mitglied
0
Hallo Gemeinde,

ich stehe mal wieder vor einem Problem:

In meiner App werden in verschiedenen Threads quasi zur gleichen Zeit HTTP-Anfragen ausgeführt.
Die Antworten dieser beiden Anfragen werden jedoch leider "durcheinandergeworfen", die eine Anfrage bekommt also die Antwort der anderen und umgekehrt.

Woran kann soetwas liegen?

Es ist keinerlei Schnittpunkt vorhanden, alles sind verschiedene Instanzen.

Hier noch ein Codeschnipsel von solch einer Anfrage:
Code:
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 10000);
DefaultHttpClient client = new DefaultHttpClient(httpParams);
String url = "http://irgendeine.url/die/etwas/zurueck.gibt";
HttpPost anfrage = new HttpPost(url);
try {
    anfrage.setEntity(new UrlEncodedFormEntity(params));
} catch (UnsupportedEncodingException e1) {
    Log.e(TAG, "UnsupportedEncodingException", e1);
}
BufferedReader in = null;
anfrage.addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
anfrage.addHeader("User-Agent", "eine Browserkennung die erforderlich ist.");
HttpResponse antwort = client.execute(anfrage);
in = new BufferedReader(new InputStreamReader(antwort.getEntity().getContent(), "UTF-8"));
(...)
Danke für eure Antworten!
Gruß,
Timo
 
mhh, also ich mache in meiner app auch mehrere anfragen gleichzeitig aber bei mir mischt sich nichts.
Ersetze mal das HttpPost Objekt durch ein HttpGet Objekt.
 
Kann ich leider nicht, da ich einer GET-Anfrage via
Code:
setEntity(new UrlEncodedFormEntity(parameter));
keine Parameter mitgeben kann.

Des weiteren sende ich so viel, dass es via GET nicht übertragen werden kann. URLs sind ja auf eine bestimmte Länge begrenzt.

Gruß,
Timo
 
Also für mich sieht das nach klassischem HTTP aus.

Du könntest ja einen Identifier mitgeben, und diesen dann beim Response auslesen.
 
Danke für eure Antworten.

"params" ist kein Typo, sondern eine Variable und sieht so aus:
Code:
final List<NameValuePair> params = new ArrayList<NameValuePair>();
        for (String key : bundle.keySet()) {
            params.add(new BasicNameValuePair(key, bundle.getString(key)));
        }
Kardroid schrieb:
Also für mich sieht das nach klassischem HTTP aus.

Du könntest ja einen Identifier mitgeben, und diesen dann beim Response auslesen.

Ich merke das ja schon, wenn die falsche Antwort ankommt. Aber wie komme ich denn dann an die richtige Antwort dazu?
Klassisches HTTP besteht ja eigentlich aus einer Anfrage an den Server und einer Antwort vom Server. Anschließend wird die Verbindung beendet und alles läuft über eine Verbindung. Wie kann denn da so ein Murks entstehen?

Gruß,
Timo
 
Aus dem Bauch heraus - man müsste das alles genauer Debuggen:

Ich glaube das params der Knackpunkt ist. Wenn Du in den catch{} Block laufen solltest machst Du unvermittelt weiter. Es sei denn Du hast den Code in Deinem Post extremst zusammengestrichen.

Ist params lokal oder global oder statisch?

Was enthält params wenn Du eine Exception bekommst?

Logge Dir mal die bundle.keySet() für alle Threads.

Wie gesagt - nur aus dem Bauch.

Gruß
Harald
 
aslkoeln schrieb:
Ist params lokal oder global oder statisch?
Alles Variablen, die nur für die Methode definiert sind, also lokal.


aslkoeln schrieb:
Was enthält params wenn Du eine Exception bekommst?
Weiß ich nicht, bis jetzt habe ich diese Exception noch nie bekommen.

aslkoeln schrieb:
Logge Dir mal die bundle.keySet() für alle Threads.
Den Bundle habe ich selbst befüllt. Da sind lediglich Strings enthalten.

Gruß,
Timo
 
Sorry, dann muss ich erst mal passen.

Tut mir leid, hätte gerne geholfen.

Gruß
Harald
 
TiJay schrieb:
Die Antworten dieser beiden Anfragen werden jedoch leider "durcheinandergeworfen", die eine Anfrage bekommt also die Antwort der anderen und umgekehrt.
Vermutlich liegt es daran, dass alles über einen Conntection-Manager von Android läuft. Vielleicht könnte ein Synchronisieren der Tasks helfen.
 
Guter Hinweis. Vielleicht könnte dann die folgende Initialisierung helfen. Sie schafft einen eigenen Context:

Code:
BasicCookieStore  cookieStore;
DefaultHttpClient httpClient;
BasicHttpContext  httpContext;

cookieStore = new BasicCookieStore();
httpContext = new BasicHttpContext();
if (cookieStore != null && httpContext != null) {
  httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
  httpClient = new DefaultHttpClient();

  HttpPost httpPost = new HttpPost(<DeineUrl>);
  HttpResponse httpResponse = httpClient.execute(httpPost, httpContext);
  int status = httpResponse.getStatusLine().getStatusCode();
  if (status == HttpStatus.SC_OK) {
    HttpEntity httpEntity = httpResponse.getEntity();  
    if (httpEntity != null) {  
      //
    }
  }
}

Gruß
Harald
 

Ähnliche Themen

B
Antworten
3
Aufrufe
911
jogimuc
J
G
Antworten
0
Aufrufe
396
gnome2012
G
A
  • AnimaAngelo85
Antworten
1
Aufrufe
337
swa00
swa00
Zurück
Oben Unten