【问题标题】:String that came as http response cut off? - Java, Platform Android 3.0http响应中断时出现的字符串? - Java,平台Android 3.0
【发布时间】:2011-07-05 15:31:09
【问题描述】:

我遇到了一个非常奇怪的问题,我不知道从哪里开始。

我正在向服务器发送一个 http 请求并得到一个简单的字符串作为响应。这在我的智能手机应用程序中运行良好;它甚至在我的浏览器中也能正常工作。然而,虽然我认为我只是简单地复制并粘贴了智能手机代码,但它不再适用于我的平板电脑(Android 3.0.1)版本的应用程序。

我用调试器检查过,旧版本得到一个长度为 2958 个字符的字符串。不过,新版本只得到一个长度为 1334 的字符串。我已经记录了新版本的URL,把它放到我的浏览器中,又得到了一个2985个字符的字符串。

我真的无法在我的代码中找到任何重大差异(请参见下文)。另外,我不敢相信 Android 中会有一些限制字符串长度的变化?!

那么有人有想法吗?


原始智能手机代码:

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();

        }
    }
}

新平板版本中的代码:

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;

        }
    }
}

两个请求都在 AsyncTask 中运行。

亲切的问候, 水母

【问题讨论】:

  • 您是否通过Log.<?>() 将字符串写入日志?日志有一个最大输出长度,所以检查最好将字符串分成不超过 500 个字符左右的片段,以确保所有内容都被打印出来。
  • 您可能会发现 EntityUtils 在将实体作为字符串检索时很有用,从而使您无需使用最后 10 行左右。
  • @LeffelMania:不,我停止了调试选项并检查了那里的字符串长度。 @David Caunt:谢谢!

标签: java android string httprequest android-3.0-honeycomb


【解决方案1】:

我不确定这是不是这个原因,但看起来很可疑 -

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

我会等到使用 HttpEntity 之后再关闭客户端。

【讨论】:

  • 你这么快就发现了我的错误真是太棒了,非常感谢!
【解决方案2】:

我自己是新手,所以如果我听起来像个白痴,请原谅我。 我在这篇文章中发现了一个有趣的观点:

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

它说“你永远不应该在你的主线程上发出网络请求。事实上,在即将发布的 Honeycomb 版本中 我们已经在主线程上发出了一个致命错误的网络请求 strong>,除非您的应用针对 Honeycomb 之前的 API 版本"

您是否在单独的 ASyncThread 中运行您的请求?我不能通过查看代码来判断。我自己做这件事很开心。如果您有任何想法,请告诉我,因为我很想看看您是如何做到的。

真诚地, 安德鲁

【讨论】:

  • 水母,我刚看到你的笔记。他们正在运行异步。我道歉。我只是心慌意乱地自己寻找答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多