1

我们通常在android开发中从服务器响应中获取数据。

/*
* get server response inputStream
*/
InputStream responseInputStream;

解决方案1:通过多次读取获取响应字符串。

      /*
       * get server response string
      */
    StringBuffer responseString = new StringBuffer();
    responseInputStream = new InputStreamReader(conn.getInputStream(),"UTF-8");

    char[] charBuffer = new char[bufferSize];
    int _postion = 0;
    while ((_postion=responseInputStream.read(charBuffer)) > -1) {
        responseString.append(charBuffer,0,_postion);
        }
    responseInputStream.close();

解决方案2:仅获得一次读取响应。

String responseString = null;
int content_length=1024;
// we can get content length from response header, here assign 1024 for simple.
responseInputStream = new InputStreamReader(conn.getInputStream(),"UTF-8");

char[] charBuffer = new char[content_length];
int _postion = 0;
int position = responseInputStream.read(charBuffer)
if(position>-1){
   responseString = new String(charBuffer,0,position );
 }
responseInputStream.close();

哪种解决方案具有更好的性能?为什么?

注意:服务器响应json格式数据,小于1M字节。

4

3 回答 3

2

为什么要重新发明轮子?;)

如果您使用的是 HttpClient,那么只需使用EntityUtils.toString(...).
我猜你正在使用HttpURLConnection. 然后EntityUtils.toString(...)从 Apache HttpClient中查看源代码。您的第一种方法与它类似。

顺便说一句,第二个代码更糟糕,因为:

new String(charBuffer,0,position )运行垃圾收集器

在 EntityUtils 中,甚至在 EntityUtils 中:

int content_length = 1024;在大多数情况下 8192 是套接字缓冲区的默认值,因此您的代码运行 while 循环的频率可能是它的 8 倍。

于 2012-11-11T19:07:05.383 回答
1

如果您不想显示下载/传输的数据量,我会推荐第二种方法。由于对象是作为一个整体读取的,并且由于您的 JSON 字符串的大小与 1M 相当,因此下载需要一些时间。到时候你最多可以给用户发一条文字,说正在下载…… 您无法通知用户下载的数量。 但是,如果您想显示下载的数据量,请使用您提供的一种方法。您从服务器部分读取数据的位置。您可以使用下载的数量更新UI。例如,下载了 25%...


char[] charBuffer = new char[bufferSize];
    int _postion = 0;
    int i=0;
    while ((_postion=responseInputStream.read(charBuffer)) > -1) {

       //((i*buffer_size)/content_length) * 100  % completed..

        i++;
        }


所以,我会说秒方法更好。


顺便说一句,你考虑过这个吗?

ObjectInputStream in = new InputStreamReader(conn.getInputStream(),"UTF-8");
if(resposeCode==200)
{
 String from_server=(String)  in.readObject();
}

将输入字符串作为对象读取。类实现可序列化的任何对象都可以使用传递ObjectOutputStream 和接收使用ObjectInputStream()

于 2012-11-09T03:38:27.550 回答
0

我觉得第一个很好

因为,首先 ,这将在 char to char method 中读取您的响应。

其中,第二个 将尝试读取整个响应对象或作为对象的关键字段。

因此,据我所知,根据我的知识,首先最好与第二个露营。如果有人想编辑,那将不胜感激。

于 2012-11-06T09:09:47.630 回答