2009-10-23 25 views
20

Cho đến gần đây, ứng dụng của chúng tôi đã chia sẻ một cá thể Apache HttpClient duy nhất sử dụng ThreadSafeClientConnManager trên toàn bộ ứng dụng. Ví dụ ứng dụng khách http được tổ chức bởi một lớp đơn.Android: Một hoặc nhiều phiên bản của HttpClient cho mỗi ứng dụng

Vì tôi không thích mẫu đơn cho nhiều vấn đề, tôi đã tái cấu trúc API accessor thành một đối tượng cho mỗi luồng, nhưng bây giờ cho mỗi thread (chủ yếu là mỗi Activity/Service trong trường hợp của chúng ta) tạo.

Nó không phải là tôi có vấn đề với cách tiếp cận mới này, nhưng tôi đã đọc rằng các folks Apache đề nghị chỉ có một ví dụ cho mỗi ứng dụng vì lý do hiệu suất.

Nhìn bề ngoài, những gì chúng ta đã làm trước được điều này:

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

Bây giờ, chúng ta làm điều này:

Activity1 ... ActivityN 
    |    | 
    |    | 
HttpClient1 HttpClientN 

Làm thế nào để các bạn thực hiện điều này trong các ứng dụng của bạn? Nếu bạn chia sẻ một HttpClient duy nhất trên ứng dụng của mình và có thể có nhiều chuỗi đồng thời, bạn làm cách nào để xử lý quyền truy cập vào nó?

+0

Bạn có thể không tham gia vào cách tiếp cận nào tốt hơn phương pháp đầu tiên (Singleton) hoặc phương pháp thứ hai không? –

+0

Tôi sử dụng phương pháp đầu tiên ngay bây giờ. Một nhà máy chỉ quan tâm đến một cá thể, sau đó sử dụng ThreadSafeConnManager để đối phó với các yêu cầu đồng thời. Tôi tin rằng đó là cách AndroidHttpClient (cấp độ FroYo và API mới hơn) được thiết lập. Hoạt động tốt với các khung công tác DI như Guice. – Matthias

Trả lời

12

Tóm lại:

Tạo một thể hiện của org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager và sử dụng nó khi xây dựng một DefaultHttpClient.

liên kết để lấy mẫu nguồn: HttpClient multithreaded access

Edit: Xin lỗi, không thấy chỉnh sửa của bạn trước khi đăng. Chẳng có gì sai với "Singleton" trong trường hợp này.

+0

Tôi đã đọc (trong hướng dẫn tôi tin) rằng nó hoàn toàn tốt đẹp để duy trì một cá thể HttpClient tĩnh. Tôi đoán đó là những gì tôi sẽ làm sau đó. Bằng cách đó tôi có thể loại bỏ singleton và đồng thời chia sẻ một phiên bản ứng dụng khách trên ứng dụng. – Matthias

+4

@Matthias: Nếu bạn đang thực hiện một singleton với 'HttpClient', khi nào bạn gọi' httpClient.getConnectionManager(). Shutdown(); '? – Macarse

Các vấn đề liên quan