1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

mehrere DefaultHTTPClients zur gleichen Zeit

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von TiJay, 13.04.2011.

  1. TiJay, 13.04.2011 #1
    TiJay

    TiJay Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    04.04.2011
    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
     
  2. Sabian, 13.04.2011 #2
    Sabian

    Sabian Junior Mitglied

    Beiträge:
    27
    Erhaltene Danke:
    2
    Registriert seit:
    21.12.2010
    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.
     
  3. TiJay, 14.04.2011 #3
    TiJay

    TiJay Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    04.04.2011
    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
     
  4. Kardroid, 14.04.2011 #4
    Kardroid

    Kardroid Android-Experte

    Beiträge:
    482
    Erhaltene Danke:
    80
    Registriert seit:
    03.10.2009
    Also für mich sieht das nach klassischem HTTP aus.

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

    aslkoeln Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    13.04.2011
    Ist das params ein Typo?

    Gruß
    Harald
     
  6. TiJay, 14.04.2011 #6
    TiJay

    TiJay Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    04.04.2011
    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)));
            }
    
    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
     
  7. aslkoeln, 14.04.2011 #7
    aslkoeln

    aslkoeln Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    13.04.2011
    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
     
  8. TiJay, 14.04.2011 #8
    TiJay

    TiJay Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    04.04.2011
    Alles Variablen, die nur für die Methode definiert sind, also lokal.


    Weiß ich nicht, bis jetzt habe ich diese Exception noch nie bekommen.

    Den Bundle habe ich selbst befüllt. Da sind lediglich Strings enthalten.

    Gruß,
    Timo
     
  9. aslkoeln, 14.04.2011 #9
    aslkoeln

    aslkoeln Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    13.04.2011
    Sorry, dann muss ich erst mal passen.

    Tut mir leid, hätte gerne geholfen.

    Gruß
    Harald
     
  10. garak, 15.04.2011 #10
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,794
    Registriert seit:
    12.12.2009
    Vermutlich liegt es daran, dass alles über einen Conntection-Manager von Android läuft. Vielleicht könnte ein Synchronisieren der Tasks helfen.
     
  11. aslkoeln, 15.04.2011 #11
    aslkoeln

    aslkoeln Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    1
    Registriert seit:
    13.04.2011
    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
     

Diese Seite empfehlen