2010-12-14 8 views
6

私は知っておく必要があります:連続していくつかの親指をダウンロードする最速の方法は、10画像を言うことができます。これは、組み込みのブラウザが非常に賢い方法でこれを行うように思えます。Android:http経由でいくつかのビットマップ/サムを読み込む最速の方法は何ですか?

私はGoogle'dを持っており、ほとんどの開発者はListAdapter内、ImageViewの中でそれを表示するには、JPEGをダウンロードするには、HttpURLConnectionクラスを使用していることがわかっなど

一部の開発者はそれとしてDefaultHttpClientクラスを使用して、ダウンロードを実装します実際にはGoogle recommendsでは、ネイティブJava HttpUrlConnectionではなく、Apache Httpクライアントを使用するように、タイムアウトなどをサポートしています。つまり、上記の両方の起動方法はうまく動作しますが、HTCがサムネイルをダウンロードするブラウザのビルドと比べて非常に遅いです。内蔵のブラウザは、自分のコードで同じビットマップをダウンロードしようとすると、約5倍から10倍速くイメージをダウンロードするようです。そして、はい、私は常に別のワーカースレッド(GUIスレッドではありません)でダウンロード/ http作業を行います。

組み込みブラウザが親指をどのようにダウンロードしているか、少なくともサーバーから複数の画像をダウンロードする最も速い方法は何ですか?

私はこのコードを使用して試してみました:

DefaultHttpClient client = new DefaultHttpClient(); 
HttpParams httpParameters = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT); 
HttpConnectionParams.setSoTimeout(httpParameters, SO_TIMEOUT);  
client.setParams(httpParameters); 
client.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() { 
    @Override 
    public long getKeepAliveDuration(HttpResponse response, HttpContext context) 
    { 
     return 5000; 
    } 
}); 

、私は、forループ内のいくつかのビットマップ/親指を取得するために、この接続を使用します。

public static Bitmap downloadBitmap(String url, DefaultHttpClient client){ 

    HttpResponse response = null; 
    HttpGet get = new HttpGet(url); 
    try { 
     response = client.execute(get); 
     return BitmapFactory.decodeStream(response.getEntity().getContent()); 
    } 
    catch (ClientProtocolException e1) { 
     e1.printStackTrace(); 
    } 
    catch (IllegalStateException e){ 
     e.printStackTrace(); 
    } 
    catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

    return null; 
} 

私はTestPage.htmlを作成しました10ビットマップで、内蔵のブラウザで読み込みます。ブラウザは、1秒以内にすべてのサムでページをレンダリングします。そして、私はブラウザにキャッシュされていないと確信しています。

私が同じ親をダウンロードして表示する単純な操作をしようとすると、その操作はかなり遅くなります。

私は、Google Androidチームがこれを取り上げて、次のデベロッパーカンファレンスのビデオで話すことを願っています。

すべての開発者が実際に同じことをしようとしているときに、この「ダウンロードビットマップ」ユースケースを独自の方法で解決しようとしているように見えるので、ベストプラクティスを定義する必要があります。

また、同じDefaultHttpClientオブジェクトを使用して、異なるURL(HttpGetオブジェクト)でexecute()を呼び出すことでいくつかのイメージをフェッチするためのテストを行いましたが、速度はまだ組み込みのブラウザにはありません。私の要求は接続キープアライブフラグになっていますが、違いはありません。

答えて

1

内蔵のブラウザがより速くあなたのコードのように、なぜ2つの理由があります。

  1. ブラウザは主にネイティブコードで実装されている(例えばWebKitのは)
  2. 複数のダウンロードを同時に(複数のスレッド)を行っています
+0

ポストのコードのように、ブラウザがすべてのダウンロードを一度に行っているのではなく、シリアルで行うことはほぼ確実です。両方ともプラットフォーム内の同じ基本I/Oを使用します。 JavaとWebKitのラッパーコードの違いは、確実にモバイルネットワークの待ち時間よりもはるかに小さいはずです。 –

+0

特に、モバイルネットワークデバイスの場合、並行処理が主な理由です。待ち時間は特にありません。パラレルダウンロードは、N-1 * RTTによる総転送時間を効果的に削減します – symcbean

1

複数の画像を一度にダウンロードするにはスレッドを使用します。これはあなたのコードをブラウザと同じようにするのに役立ちます。

関連する問題