2009-10-23 5 views
20

Do niedawna nasza aplikacja udostępniała pojedynczą instancję Apache HttpClient przy użyciu ThreadSafeClientConnManager w całej aplikacji. Instancja klienta http była przechowywana przez pojedynczą klasę.Android: Jedna lub wiele instancji HttpClient na aplikację

Ponieważ nie lubię pojedynczego wzorca dla jego licznych problemów, refaktoryzowałem nasz akcesor API, aby był obiektem wątku, ale teraz dla każdego wątku (co w większości przypadków oznacza aktywność/usługę w naszym przypadku), nowa instancja HttpClient jest stworzony.

Nie chodzi o to, że mam problem z tym nowym podejściem, ale przeczytałem, że ludzie Apache sugerują, aby mieć tylko jedną instancję na aplikację ze względu na wydajność.

Wizualnie, co robiliśmy wcześniej było to:

HttpClient (thread safe) 
      | 
      | 
     /\ 
     /\ 
Activity1...ActivityN 

Teraz to zrobić:

Activity1 ... ActivityN 
    |    | 
    |    | 
HttpClient1 HttpClientN 

Jak robicie to w swoich aplikacjach? Jeśli udostępniasz jeden HttpClient w całej aplikacji i potencjalnie wiele równoczesnych wątków, w jaki sposób radzisz sobie z dostępem do niego?

+0

Czy mógłbyś sprawdzić, które podejście jest lepsze od pierwszego (Singleton) lub drugiego? –

+0

Używam teraz pierwszego podejścia. Fabryka zajmuje się tylko instancją jednej instancji, która następnie używa ThreadSafeConnManager, aby poradzić sobie z równoczesnymi żądaniami. Uważam, że tak jest skonfigurowany AndroidHttpClient (FroYo i nowsze poziomy API). Działa również ze strukturami DI, takimi jak Guice. – Matthias

Odpowiedz

12

W skrócie:

Utwórz instancję org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager i użyć go przy konstruowaniu DefaultHttpClient.

Link do próbki źródło: HttpClient multithreaded access

EDIT: Niestety, nie widzi swoją edycję przed wysłaniem wiadomości. W tym przypadku nie ma nic nie w porządku z "Singleton".

+0

Czytałem (w samouczku uważam, że), że jest to w porządku utrzymanie statycznej instancji HttpClient. Sądzę, że właśnie to zrobię. W ten sposób mogę pozbyć się singletonu i jednocześnie udostępnić jedną instancję klienta w całej aplikacji. – Matthias

+4

@Matthias: Jeśli robisz singleton z 'HttpClient', kiedy wywołujesz' httpClient.getConnectionManager(). Shutdown(); '? – Macarse