作成中の Android アプリケーションの Web サイトに HTTP GET リクエストを送信しています。
私は DefaultHttpClient を使用しており、HttpGet を使用してリクエストを発行しています。エンティティ応答を取得し、そこからページの HTML を取得するための InputStream オブジェクトを取得します。
次に、次のように返信を繰り返します。
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
String x = "";
x = r.readLine();
String total = "";
while(x!= null){
total += x;
x = r.readLine();
}
しかし、これは恐ろしく遅いです。
これは非効率的でしょうか? 大きなウェブページを読み込んでいないので -コークゾーンファイルサイズは大きくありません。もっと良い方法はありますか?
ありがとう
アンディ
ベストアンサー1
あなたのコードの問題は、大量の重い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
、以下を追加するだけです。
文字列結果 = total.toString();
もっとわかりやすく説明してみます...
a += b
(またはa = a + b
)(およびa
はb
文字列)は、両方a
そしてb
新しいオブジェクトにコピーします( もコピーしますa
。これには蓄積されたString
)、そして各反復でそれらのコピーを実行します。a.append(b)
( はa
)は にStringBuilder
直接b
内容を追加するa
ので、各反復で蓄積された文字列をコピーする必要はありません。