Android 入力ストリームから効率的に読み取る 質問する

Android 入力ストリームから効率的に読み取る 質問する

作成中の 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)(およびab文字列)は、両方 a そして b新しいオブジェクトにコピーします( もコピーしますa。これには蓄積された String)、そして各反復でそれらのコピーを実行します。
  • a.append(b)( はa)は にStringBuilder直接b内容を追加するaので、各反復で蓄積された文字列をコピーする必要はありません。

おすすめ記事