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:1回だけ読み取り応答を取得します。

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

パフォーマンスが優れているソリューションはどれですか?なぜ?

:1Mバイト未満のサーバー応答json形式のデータ。

4

3 に答える 3

2

なぜあなたは車輪を再発明しているのですか?;)

HttpClientを使用している場合は、を使用してくださいEntityUtils.toString(...)
使用していると思いますHttpURLConnection。次に、EntityUtils.toString(...)ApacheHttpClientから見てください-ソースコード。あなたの最初のアプローチはそれに似ています。

ところで、2番目のコードは次の理由で悪化しています:

new String(charBuffer,0,position )ガベージコレクターを実行します

EntityUtilsの両方で、さらには:

int content_length = 1024;ほとんどの場合、8192はソケットバッファのデフォルトであるため、コードはループ中に8倍の頻度で実行される可能性があります。

于 2012-11-11T19:07:05.383 に答える
1

ダウンロード/転送されたデータの量を表示したくない場合は、 2番目の方法をお勧めします。オブジェクト全体が読み取られ、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

最初のものは良いと思います

なぜなら、最初 に、chartocharメソッドで応答を読み取るからです。

ここで、2番目 は、応答オブジェクト全体を読み取るか、オブジェクトのキーファイルとして読み取ろうとします。

だから、私が思うように、そして私の知識によれば、最初は2番目のキャンピングカーに適しています。誰かが編集したいなら、それは本当にありがたいです。

于 2012-11-06T09:09:47.630 に答える