これが以前に尋ねられたことは知っていますが、決定的な結論、または可能なアプローチの長所と短所を示す少なくとも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 に最適です。透過的な圧縮と応答キャッシュにより、ネットワークの使用量が削減され、速度が向上し、バッテリーが節約されます。