1. ホーム
  2. java

[解決済み] Android 入力ストリームからの読み取りを効率的に行う

2022-04-26 13:33:24

質問

作っているandroidアプリのWebサイトにHTTP getリクエストをしています。

DefaultHttpClientを使用し、HttpGetを使用してリクエストを発行しています。エンティティ・レスポンスを取得し、そこからInputStreamオブジェクトを取得して、ページのhtmlを取得しています。

そして、次のようにして返信を循環させています。

BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
String x = "";
x = r.readLine();
String total = "";

while(x!= null){
total += x;
x = r.readLine();
}

しかし、これでは恐ろしく遅い。

これって非効率的なんでしょうか?大きなウェブページを読み込んでいるわけではないのですが......。 www.cokezone.co.uk ので、ファイルサイズは大きくありません。何か良い方法はないでしょうか?

ありがとうございます

アンディ

解決方法は?

あなたのコードの問題は、たくさんの重い String オブジェクトを作成し、その内容をコピーして操作を実行します。その代わりに StringBuilder を作成しないようにするため、新しい String オブジェクトを追加し、char 配列をコピーしないようにします。あなたの場合の実装は、次のようなものでしょう。

BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder total = new StringBuilder();
for (String line; (line = r.readLine()) != null; ) {
    total.append(line).append('\n');
}

これで total に変換することなく String として必要な場合、その結果は String を追加するだけです。

String result = total.toString();

もっとうまく説明しよう・・・。

  • a += b (または a = a + b を指定します。 ab が文字列の場合 両方とも a そして b を新しいオブジェクトにコピーしていることに注意してください。 a を含む。 蓄積された String ) のコピーを、各反復で行っています。
  • a.append(b) ここで aStringBuilder を直接追加します。 b の内容を a というように、繰り返しの度に蓄積された文字列をコピーしないようにします。