2010-12-14 7 views
6

Ich muss wissen: Was ist der schnellste Weg, um mehrere Daumen in Folge herunterzuladen, sagen wir 10 Bilder. Es sieht so aus, als würde der integrierte Browser dies auf sehr clevere Weise tun.Android: Was ist der schnellste Weg, um mehrere Bitmaps/Thumbs über http zu laden?

Ich habe Google'd und festgestellt, dass die meisten Entwickler die HttpURLConnection Klasse werden mit einem jpeg zum Download in einem Image innerhalb eines ListAdapter, anzuzeigen usw.

Einige Entwickler implementiert die Download unter Verwendung DefaultHttpClient Klasse, wie es hat eine bessere Unterstützung für Timeouts usw. In der Tat Google recommends den Apache HTTP-Client zu verwenden, und nicht die systemeigene Java-HttpUrlConnection. Das heißt, beide genannten Staregies funktioniert gut, aber sie sind sehr langsam im Vergleich zu dem, wie der eingebaute Browser auf meinem HTC Wunsch Thumbnails herunterladen. Der eingebaute Browser scheint Bilder etwa 5x-10x schneller herunterzuladen, als wenn man versucht, dieselben Bitmaps mit meinem eigenen Code herunterzuladen. Und ja, ich mache immer die Download/http-Arbeit an einem separaten Worker-Thread (nicht GUI-Thread).

Wissen Sie, wie der integrierte Browser Thumbs herunterlädt, oder wie ist der schnellste Weg, mehrere Bilder von einem Server herunterzuladen?

ich diesen Code versucht haben, mit:

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; 
    } 
}); 

Nun, ich benutze diese Verbindung mehrere Bitmaps/Daumen in eine for-Schleife zu holen:

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; 
} 

Ich habe eine testpage.html mit 10 Bitmaps und geladen mit dem integrierten Browser. Der Browser rendert die Seite mit allen Daumen innerhalb von 1 Sekunden. Und ich bin sicher, dass sie nicht im Browser zwischengespeichert werden, da ich die 10 Bilder für jede Seitenaktualisierung randomisieren.

Wenn ich versuche, eine einfache Aktivität zu machen, die die gleichen Daumen herunterlädt und anzeigt, ist es viel langsamer.

Ich hoffe, dass das Google Android Team dieses aufgreift und es in einem seiner Video spricht auf der nächsten Entwicklerkonferenz.

Sie sollten eine Best-Practice dafür definieren, da es scheint, dass jeder Entwickler versucht, diesen "Download-Bitmap" -Usfall auf seine eigene Art und Weise zu lösen, wenn wir alle versuchen, dasselbe zu tun.

Ich habe auch getestet mit dem gleichen DefaultHttpClient-Objekt, um mehrere Bilder durch Aufruf von execute() mit verschiedenen URLs (HttpGet Objekte) zu holen, aber es ist immer noch weit von der Geschwindigkeit, um den integrierten Browser. Ich sehe, dass meine Anforderungen die Verbindung Keep-Alive-Flag gesetzt hat, aber es scheint keinen Unterschied zu machen.

Antwort

1

Es gibt zwei Gründe, warum die integrierten Browser ist schneller als Ihr Code:

  1. Der Browser hauptsächlich in nativen Code (zB WebKit)
  2. mehrere Downloads gleichzeitig durchgeführt werden implementiert ist (mehrere Threads)
+0

Es ist fast sicher, dass der Browser alle Downloads auf einmal durchführt, nicht seriell, wie im Code der Post.Beide verwenden dieselbe zugrunde liegende E/A in der Plattform. Der Unterschied im Wrapper-Code in Java gegenüber WebKit muss sicherlich um Größenordnungen kleiner sein als die Latenz im Mobilfunknetz. –

+0

Nein - Nebenläufigkeit ist der Hauptgrund - Latenz - vor allem für mobile Netzwerkgeräte wird jede Übertragung dominieren. Parallele Downloads reduzieren effektiv die gesamte Übertragungszeit um N-1 * RTT – symcbean

1

Ich würde Threads verwenden, um mehrere Bilder auf einmal zu downloaden. Dies sollte helfen, Ihren Code auf Augenhöhe mit dem Browser zu bringen.

Verwandte Themen