2

これが以前に尋ねられたことは知っていますが、決定的な結論、または可能なアプローチの長所と短所を示す少なくとも1つの答えを見つけることができなかったため、質問する必要があります:

たとえば、Web サービスなどのインターネットからデータを読み取る場合、このデータを読み取るための正しい、またはより効率的な方法は何ですか?

私が一瞥したすべての本から、データを読み取るための少なくとも 4 つの方法を見つけました。

1) 一度に特定の文字数を読み取る。この場合、データは 4026 文字のチャンクで読み取られます

BufferedReader reader = new BufferedReader(
new InputStreamReader(in, encoding));
char[] buffer = new char[4096];
StringBuilder sb = new StringBuilder();
int downloadedBytes = 0;
int len1 = 0;
while ((len1 = reader.read(buffer)) > 0) {  
    sb.append(buffer);  
}
return sb.toString();

2)コンテンツの長さを知っているデータを読む

int length =(HttpURLConnection) urlConnection.getContentLength();
InputStream inputStream = urlConnection.getInputStream();
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder(length);
char[] buffer = new char[length];
int charsRead;
while ((charsRead = bufferedReader.read(buffer)) != -1) {
    stringBuilder.append(buffer, 0, charsRead);
}
return stringBuilder.toString();

3) データを 1 行ずつ読み取る:

BufferedReader reader=new BufferedReader(new InputStreamReader(c.getInputStream()));
StringBuilder buf=new StringBuilder();
String line=null;
while ((line=reader.readLine()) != null) {
  buf.append(line);
}
return(buf.toString());

4) データを 1 文字ずつ読み取ります。

InputStream in = mConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(
        in, enconding));    
int ch;
StringBuilder sb = new StringBuilder();         
while ((ch=reader.read()) > 0) {            
    sb.append((char)ch);
}

return sb.toString().trim();

これら 4 つの異なる手法のうち 3 つを試しましたが、3 番目の手法 (データを 1 行ずつ読み取る) を除き、3 つの手法のうち 4 番目のみが良い結果をもたらしました。

  • 最初の方法は、大量のデータを読み取ると、結果として無効なjson文字列または最後に空白のある文字列を与えるデータをカットすることが多いため、うまくいきませんでした。
  • 2 番目のアプローチは、 getContentLengthが常に信頼できるとは限らず、値が設定されていない場合、それについてできることは何もないため、そのメソッドを使用できませんでした。まあ、それが私の場合です。
  • 3 番目の方法は試しませんでした。データを「1 行」ずつ読み取るという事実がよくわからなかったからです。これは、json オブジェクトの配列を含むデータに適用されますか、それとも実際に行を含むファイルにのみ適用されますか??
  • 私が残された最後の選択肢である最後の手法であるため、試してみましたが、うまくいきましたが、大量のデータを文字ごとに読み取ることはまったく効率的ではないと思います。

それでは、ご意見やアイデアをいただければ幸いです。Web サービスからデータを読み取る場合、どのようなアプローチを使用しますか? そしてもっと重要なのはなぜですか?

ありがとう。

PD DefaultHttpClientを簡単に使用できることはわかっていますが、ドキュメントではそうしないことを明確に推奨しています。

Android 2.3 (Gingerbread) 以降では、HttpURLConnection が最適です。そのシンプルな API と小さなサイズにより、Android に最適です。透過的な圧縮と応答キャッシュにより、ネットワークの使用量が削減され、速度が向上し、バッテリーが節約されます。

4

3 に答える 3

2

データ量がそれほど大きくない場合は、どのアプローチを使用しても問題ありません。そうであれば、バッファリングを使用し、データをチャンクで読み取るのが理にかなっています。

常に取得できるとは限らないため、2番目のアプローチはあまり良くありませんContentLength

次に、データが text/html/JSON の場合、チャンク サイズを気にする必要がないため、3 番目のアプローチを使用できます。また、着信データを行ごとに出力して、デバッグを目的とすることもできます。

データが画像のようなバイナリ/base64 ストリームの場合、最初のアプローチを使用して、4k (通常は使用される) ブロックでデータを読み取る必要があります。

アップデート:

ところで、DefaultHttpClient私は恐ろしいものの代わりにAndroidHttpClientシングルトンとして使用しており、スムーズに動作します:)

于 2014-09-16T11:48:53.830 に答える
0

それは重要です。最適なパフォーマンスは、InputStream から適切なサイズのバッファーに読み取ることです。このようにして、同じ操作を何千回も繰り返すのではなく、一度に適切な量のデータを転送します。常に Content-length ヘッダー値に依存しないでください。gzip されたコンテンツの場合、正しくないサイズが表示されることがあります。

于 2014-09-16T11:55:55.217 に答える