2010-12-14 18 views
6

Muszę wiedzieć: jaki jest najszybszy sposób na pobranie kilku kciuków z rzędu, powiedzmy 10 obrazów. Wygląda na to, że wbudowana przeglądarka robi to w bardzo sprytny sposób.Android: Jaki jest najszybszy sposób na załadowanie kilku bitmap/kciuków za pośrednictwem http?

mam Google'd i okazało się, że większość deweloperów są przy użyciu klasy HttpURLConnection pobrać jpeg, aby wyświetlić go w ImageView, wewnątrz ListAdapter itp

niektórzy deweloperzy wdraża do pobrania za pomocą klasy DefaultHttpClient jak to ma lepsze wsparcie dla limitów czasu itp. W rzeczywistości Google recommends używać klienta Http Apache, a nie natywnego Java HttpUrlConnection. To powiedziawszy, obie startegie wspominały, że działa dobrze, ale są one bardzo powolne w porównaniu do tego, w jaki sposób wbudowana przeglądarka w moim HTC chce pobierać miniatury. Wbudowana przeglądarka wydaje się pobierać obrazy około 5x-10x szybciej niż wtedy, gdy próbuję pobrać te same bitmapy z własnym kodem. Tak, zawsze wykonuję operacje pobierania/http w osobnym wątku roboczym (nie wątku GUI).

Czy ktoś wie, w jaki sposób wbudowana przeglądarka pobiera kciuki, a przynajmniej jaki jest najszybszy sposób pobrania kilku obrazów z serwera?

Próbowałem przy użyciu tego kodu:

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

Teraz mogę korzystać z tego połączenia, aby pobrać kilka bitmap/kciuk w pętli 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; 
} 

stworzyłem testpage.html z 10 bitmapami i ładuje go za pomocą wbudowanej przeglądarki. Przeglądarka renderuje stronę wszystkimi kciukami w ciągu 1 sekundy. I jestem pewien, że nie są one buforowane w przeglądarce, ponieważ losowo wybieram 10 obrazów dla każdego odświeżenia strony.

Kiedy próbuję wykonać prostą czynność, która pobiera i wyświetla te same kciuki, jest znacznie wolniejsza.

Mam nadzieję, że zespół Google Android podniesie to i uwzględni go w jednym ze swoich wystąpień wideo podczas kolejnej konferencji programistów.

Powinny określać najlepszą praktykę w tym zakresie, ponieważ wydaje się, że każdy programista próbuje rozwiązać ten przypadek "pobierz-bitmapę" na swój sposób, podczas gdy w rzeczywistości wszyscy próbujemy zrobić to samo.

Przetestowałem również przy użyciu tego samego obiektu DefaultHttpClient, aby pobrać kilka obrazów, wywołując execute() z różnymi adresami URL (obiekty HttpGet), ale wciąż jest daleko od prędkości do wbudowanej przeglądarki. Widzę, że moje prośby zasygnalizowały flagę podtrzymywania połączenia, ale nie wydaje się to mieć żadnego znaczenia.

Odpowiedz

1

Istnieją dwa powody, dla wbudowanej przeglądarce jest szybszy jak kod:

  1. Przeglądarka jest realizowany głównie w natywnym kodzie (np WebKit)
  2. Wiele pliki do pobrania są wykonywane jednocześnie (wiele wątków)
+0

Jest prawie na pewno, że przeglądarka robi wszystkie pliki do pobrania na raz, a nie szeregowo, tak jak w kodzie tego wpisu.Oba używają tych samych bazowych we/wy na platformie; różnica w kodzie opakowania w Javie i WebKit musi z pewnością być o rząd wielkości mniejsza niż opóźnienie sieci mobilnej. –

+0

Nie - współbieżność jest główną przyczyną - opóźnienie - w szczególności w przypadku urządzeń mobilnych dominować będą wszelkie transfery. Pobieranie równoległe skutecznie skraca całkowity czas transferu o N-1 * RTT – symcbean

1

Użyłbym wątków do pobrania wielu obrazów naraz. To powinno pomóc w umieszczeniu twojego kodu na równi z przeglądarką.

Powiązane problemy