4 Stimmen

Nach einer HTTP-GET-Anfrage wird die resultierende Zeichenkette abgeschnitten - der Inhalt wurde konsumiert

Ich stelle eine http-Get-Anfrage wie diese:

try {
    HttpClient client = new DefaultHttpClient();  
    String getURL = "http://busspur02.aseag.de/bs.exe?SID=5FC39&ScreenX=1440&ScreenY=900&CMD=CR&Karten=true&DatumT="+day+"&DatumM="+month+"&DatumJ="+year+"&ZeitH="+hour+"&ZeitM="+min+"&Intervall=60&Suchen=(S)uchen&GT0=Aachen&T0=H&HT0="+start_from+"&GT1=Aachen&T0=H&HT1="+destination+"";
    HttpGet get = new HttpGet(getURL);
    HttpResponse responseGet = client.execute(get);  
    HttpEntity resEntityGet = responseGet.getEntity();

    if (resEntityGet != null) {  
        //do something with the response
        Log.i("GET RESPONSE",EntityUtils.toString(resEntityGet));
    } 
    ...
} catch (...) {
    ...
}

Es funktioniert alles gut... das einzige Problem: die Ausgabe von Log.i ist abgeschnitten... Es ist nicht die komplette html-Seite. Wenn ich die gleiche Anfrage in einem Browser mache, erhalte ich die dreifache Ausgabe im Gegensatz zu der Anfrage im Emulator und unter Verwendung des obigen Codes.... was ist los?

ERROR:

04-30 14:01:01.287: WARN/System.err(1088): java.lang.IllegalStateException: Content has been consumed
04-30 14:01:01.297: WARN/System.err(1088):     at org.apache.http.entity.BasicHttpEntity.getContent(BasicHttpEntity.java:84)
04-30 14:01:01.297: WARN/System.err(1088):     at org.apache.http.conn.BasicManagedEntity.getContent(BasicManagedEntity.java:100)
04-30 14:01:01.307: WARN/System.err(1088):     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:112)
04-30 14:01:01.307: WARN/System.err(1088):     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
04-30 14:01:01.307: WARN/System.err(1088):     at mjb.project.AVV.ParseHTML.start(ParseHTML.java:177)
04-30 14:01:01.307: WARN/System.err(1088):     at mjb.project.AVV.ParseHTML.onCreate(ParseHTML.java:139)
04-30 14:01:01.307: WARN/System.err(1088):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-30 14:01:01.327: WARN/System.err(1088):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
04-30 14:01:01.327: WARN/System.err(1088):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
04-30 14:01:01.327: WARN/System.err(1088):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
04-30 14:01:01.347: WARN/System.err(1088):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
04-30 14:01:01.347: WARN/System.err(1088):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-30 14:01:01.347: WARN/System.err(1088):     at android.os.Looper.loop(Looper.java:123)
04-30 14:01:01.347: WARN/System.err(1088):     at android.app.ActivityThread.main(ActivityThread.java:4363)
04-30 14:01:01.347: WARN/System.err(1088):     at java.lang.reflect.Method.invokeNative(Native Method)
04-30 14:01:01.357: WARN/System.err(1088):     at java.lang.reflect.Method.invoke(Method.java:521)
04-30 14:01:01.357: WARN/System.err(1088):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-30 14:01:01.357: WARN/System.err(1088):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-30 14:01:01.357: WARN/System.err(1088):     at dalvik.system.NativeStart.main(Native Method)

7voto

MJB Punkte 3824

OK, ich habe es gelöst.
So wie ich es verstehe, wird der Inhalt der Entität verbraucht, wenn er nicht "verwendet" wird. Ich habe also eine neue Zeichenfolge Objekt mit dem Inhalt der Datei Entität sozusagen eine Kopie statt eines Verweises auf den Inhalt der Entität.

try {
    HttpClient client = new DefaultHttpClient();  
    String getURL = "http://busspur02.aseag.de/bs.exe?SID=5FC39&ScreenX=1440&ScreenY=900&CMD=CR&DatumT="+day+"&DatumM="+month+"&DatumJ="+year+"&ZeitH="+hour+"&ZeitM="+min+"&Intervall=120&Suchen=(S)uchen&GT0=Aachen&T0=H&HT0="+start_from+"&GT1=Aachen&T0=H&HT1="+destination+"";
    HttpGet get = new HttpGet(getURL);
    HttpResponse responseGet = client.execute(get);  
    HttpEntity resEntityGet = responseGet.getEntity();  
    String sourceString = "";

    if (resEntityGet != null) {                 
        try {
            dismissDialog();
            sourceString= new String(EntityUtils.toString(resEntityGet));
            Log.i("GET RESPONSE", sourceString);
        } catch (ParseException exc) {
            // TODO Auto-generated catch block
            exc.printStackTrace();
        } catch (IllegalStateException exc) {
            // TODO Auto-generated catch block
            exc.printStackTrace();
        }
        ...
    }
    ...
} catch(...) {
...
}

3voto

Malachi Punkte 161

DixieFlatline hat Recht.

Damit erhalte ich eine Teilausgabe:

Log.v(TAG, "RESPONSE: " + response);

Damit erhalte ich die volle Leistung:

for(String line : response.split("\n"))
   Log.v(TAG, "LINE: " + line);

1voto

DixieFlatline Punkte 7725

Ich glaube, dass Log die Anzahl der Zeichen auf 4070 begrenzt. Ich habe versucht, eine lange Zeichenkette in ddms locgat anzuzeigen und bekam nur 4070 Zeichen.

0voto

Adrião Neves Punkte 66

Großartig!

Übrigens, wenn Sie Eclipse mit der Debug-Perspektive verwenden, sollten Sie in der Ansicht "Variablen" nachsehen:

(Fenster -> Ansicht anzeigen -> Variablen)

können Sie Klicken Sie mit der rechten Maustaste auf das Fenster, wählen Sie "Max Length" und fügen Sie "0" ein. .

Auf diese Weise können Sie alle Zeichen (die vollständige HTML) in der Ansicht "Variablen" sehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X