jellyfish
jellyfish

Reputation: 7988

String that came as http response cut off? - Java, Platform Android 3.0

I have run into a very strange problem and I don't have the slightest idea where to start.

I am sending a http request to a server and get a simple string as response. This worked fine in my smartphone app; it even works fine in my browser. However, while I thought I'd simply copy-and-pasted the smartphone code, it doesn't work for my tablet (Android 3.0.1) version of the app anymore.

I have checked with the debugger and the old version gets a string with a length of 2958 characters. The new version only gets a string of the length 1334, though. I've logged the URL of the new version, put it into my browser and got a string of 2985 characters again.

I really can't find any major difference in my code (please see below). Also, I can't believe there was some change in Android that would limit string length?!

So does anybody have an idea?


Original Smartphone code:

if (CheckInternet())
{
    myURL = new URL(params[0]);

    httpClient = AndroidHttpClient.newInstance("android");

    if (rtype == RequestType.GET)
    {
        httpRequest = new HttpGet(myURL.toExternalForm());
    }
    else
    {
        httpRequest = new HttpPost(myURL.toExternalForm());

        HttpEntity myEntity = new StringEntity(message, "UTF-8");
        ((HttpPost) httpRequest).setEntity(myEntity);
    }


    HttpParams httpParams = new BasicHttpParams();
    HttpProtocolParams.setHttpElementCharset(httpParams, "UTF-8");
    HttpProtocolParams.setContentCharset(httpParams, "UTF-8");
    HttpConnectionParams.setConnectionTimeout(httpParams, timeout);
    HttpConnectionParams.setSoTimeout(httpParams, timeout);
    httpRequest.setParams(httpParams);

    response = httpClient.execute(httpRequest);

    final int statusCode = response.getStatusLine().getStatusCode();

    if (statusCode == 300 || statusCode >= 305)
    {
        errorMessage = getStatusCodeMessage(statusCode, act);
    }
    else
    {
        HttpEntity entity = response.getEntity();

        if (entity != null)
        {

            InputStream instream = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(instream, "UTF-8"));
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
                sb.append(line);

            result = sb.toString();

        }
    }
}

Code in the new Tablet version:

if (CheckInternet())
{
    if (isCancelled()) return null; //that's for an AsyncTask

    URL myURL = new URL(params[0]);
    httpClient = AndroidHttpClient.newInstance("android");

    if (isCancelled()) return null;

    if (params[1] == null)
    {
        httpRequest = new HttpGet(myURL.toExternalForm());
    }
    else
    {
        httpRequest = new HttpPost(myURL.toExternalForm());

        HttpEntity myEntity = new StringEntity(params[1], "UTF-8");
        ((HttpPost) httpRequest).setEntity(myEntity);
    }

    httpRequest.setParams(httpParams);

    if (isCancelled()) return null;

    HttpResponse response = httpClient.execute(httpRequest);
    httpClient.close();

    if (isCancelled()) return null;

    final int statusCode = response.getStatusLine().getStatusCode();

    if (statusCode == 300 || statusCode >= 305)
    {
        error = HttpHelper.getStatusCodeMessage(statusCode, getActivity());
    }
    else
    {
        if (isCancelled()) return null;

        HttpEntity entity = response.getEntity();

        if (entity != null)
        {

            InputStream instream = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(instream, "UTF-8"));
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
                sb.append(line);

            String test = sb.toString(); //that was for debugging the string
            return test;

        }
    }
}

Both requests are running in an AsyncTask.

Kind regards, jellyfish

Upvotes: 3

Views: 3214

Answers (2)

LunaSkye
LunaSkye

Reputation: 1

I am new to this myself, so please forgive me if I sound like an idiot. I found an interesting point in this article:

http://android-developers.blogspot.com/2010/12/new-gingerbread-api-strictmode.html

It said "you should never do network requests on your main thread. In fact, in the upcoming Honeycomb release we’ve made network requests on the main thread a fatal error, unless your app is targeting an API version before Honeycomb"

Are you running your request in a separate ASyncThread? I cant tell by looking at the code. I am having a doozie of a time doing this myself. Please let me know if you come up with anything, as I would LOVE to see how you did it.

Sincerely, Andrew

Upvotes: 0

Nate
Nate

Reputation: 16898

I'm not sure this is the cause, but it looks suspicious -

HttpResponse response = httpClient.execute(httpRequest);
httpClient.close(); // <--

I'd wait until after consuming the HttpEntity before closing the client.

Upvotes: 2

Related Questions