哪个更好的解决方案获取服务器响应数据

时间:2012-11-06 08:24:49

标签: android inputstream inputstreamreader

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

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

Solution1:通过多次读取获取响应字符串。

      /*
       * 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字节。

3 个答案:

答案 0 :(得分:2)

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

如果您使用的是HttpClient,请使用EntityUtils.toString(...) 我猜你正在使用HttpURLConnection。然后从Apache HttpClient查看EntityUtils.toString(...) - source code。你的第一种方法与它相似。

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

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

同时在EntityUtils中:

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

答案 1 :(得分: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();
}

将输入String作为对象读取。任何类实现可序列化的对象都可以使用ObjectOutputStream传递,并使用ObjectInputStream()

接收

答案 2 :(得分:0)

我认为第一个是好的

因为,在第一中,将以char to char方式读取您的响应。

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

所以,正如我所想,并且根据我的知识,第一个最好是第二个露营。如果有人想编辑,那么它将真正感激。