android HttpGet不完整响应BufferedReader

时间:2013-09-23 13:19:34

标签: android http-get

我正在做一个简单的http get,

我在结果上看到一个不完整的回复, 我做错了什么?

这里是代码:

class GetDocuments extends AsyncTask<URL, Void, Void> {

    @Override
    protected Void doInBackground(URL... urls) {

        Log.d("mensa", "bajando");

             //place proper url 
            connect(urls);

            return null;
    }

    public static void connect(URL[] urls)
    {

        HttpClient httpclient = new DefaultHttpClient();

        // Prepare a request object
        HttpGet httpget = new HttpGet("http://tiks.document.dev.chocolatecoded.com.au/documents/api/get?type=tree"); 

        // Execute the request
        HttpResponse response;
        try {

            response = httpclient.execute(httpget);



            // Examine the response status
            Log.d("mensa",response.getStatusLine().toString());

            // Get hold of the response entity
            HttpEntity entity = response.getEntity();
            // If the response does not enclose an entity, there is no need
            // to worry about connection release

            if (entity != null) {

                // A Simple JSON Response Read
                InputStream instream = entity.getContent();
                String result= convertStreamToString(instream);
                // now you have the string representation of the HTML request

                Log.d("mensa", "estratagema :: "+result);

                JSONObject jObject = new JSONObject(result);

                Log.d("mensa", "resposta jObject::"+jObject);

                Log.d("mensa", "alive 1");

                JSONArray contacts = null;
               contacts = jObject.getJSONArray("success");

               Log.d("mensa", "resposta jObject::"+contacts);

               Log.d("mensa", "alive");

               //instream.close();

            }


        } catch (Exception e) {}
    }



        private static String convertStreamToString(InputStream is) {
        /*
         * To convert the InputStream to String we use the BufferedReader.readLine()
         * method. We iterate until the BufferedReader return null which means
         * there's no more data to read. Each line will appended to a StringBuilder
         * and returned as String.
         */
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
                Log.d("mensa", "linea ::"+line);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
}

我称之为:

GetDocuments get = new GetDocuments();

       URL url = null;
    try {
        url = new URL("ftp://mirror.csclub.uwaterloo.ca/index.html");
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    //URL url = new URL("http://www.google.es");

    get.execute(url);

编辑1 我将不完整称为被截断的响应?

请在下面的图片中注意字符串被截断的响应,

这是因为日志大小?, 但另一个问题是它没有解析?

enter image description here

谢谢!

5 个答案:

答案 0 :(得分:2)

我不知道这是否可以解决您的问题,但您可以摆脱您的方法并简单地使用:

String responseString = EntityUtils.toString(response.getEntity());

答案 1 :(得分:1)

在过去的几天里,我遇到了完全相同的问题。我发现我的代码通过WiFi而不是3G工作。换句话说,我删除了所有通常的线程候选者。我还发现,当我在调试器中运行代码并在client.execute(...)之后等待(比如说)10秒后,它就可以了。

我猜是

response = httpclient.execute(httpget);

本身就是一个异步调用,当它缓慢返回一个部分结果时...因此JSON反序列化出错了。

相反,我尝试使用回调函数执行此版本的执行...

try {
    BasicResponseHandler responseHandler = new BasicResponseHandler();
    String json = httpclient.execute(httpget, responseHandler);         
} finally {
    httpclient.close();
}

突然之间一切正常。如果您不想要字符串,或者想要自己的代码,那么请查看ResponseHandler接口。希望有所帮助。

答案 2 :(得分:1)

我已经确认这是因为java字符串的大小限制。我通过添加带有ressponse的字符串“abcd”并在logcat中打印响应字符串来检查这一点。但结果是截断的respose没有添加字符串“abcd”。

那是

try {
BasicResponseHandler responseHandler = new BasicResponseHandler();
String json = httpclient.execute(httpget, responseHandler);  
json= json+"abcd";
 Log.d("Json ResponseString", json);
} finally {
httpclient.close();
}

所以我放了一个arrayString来收集响应。为了制作数组,我使用“}”

分割了我的json格式响应

下面给出了代码(这只是一个解决方法)

   BasicResponseHandler responseHandler = new BasicResponseHandler();
   String[] array=client.execute(request, responseHandler).split("}");

然后,您可以使用自定义类将每个对象解析为json对象和json数组。

如果你有任何其他好的方法来存储响应,请分享,因为我正在为每个不同的json响应创建自定义方法);。

谢谢

曼阿尔沙

答案 3 :(得分:1)

您好我正在使用Gson库来处理响应。

http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html

由于 艾尔沙德

答案 4 :(得分:1)

由于声誉,我不能直接评论,但是为了回应https://stackoverflow.com/a/23247290/4830567我觉得我应该指出Java String的大小限制大约是2GB(Integer.MAX_VALUE)所以这不是原因这里的截断。

根据https://groups.google.com/d/msg/android-developers/g4YkmrFST6A/z8K3vSdgwEkJ,logcat具有大小限制,这就是为什么附加“abcd”并在logcat中打印不起作用的原因。 String本身会有附加的字符。之前链接的讨论还提到,HTTP协议本身的大小限制有时可能是一个因素,但大多数服务器和客户端在内部处理此约束,以便不将其暴露给用户。