2009-10-23 4 views
20

Fino a poco tempo fa, la nostra app condivideva un'unica istanza HttpClient di Apache che utilizzava ThreadSafeClientConnManager su tutta l'applicazione. L'istanza del client http era detenuta da una classe singleton.Android: una contro molte istanze di HttpClient per applicazione

Poiché mi piace il pattern Singleton per i suoi numerosi problemi, rifattorizzata nostra di accesso API per essere un oggetto per-thread, ma ora ogni filo (che significa principalmente per attività/servizio nel nostro caso) una nuova istanza HttpClient è creato.

Non è che io abbia problemi con questo nuovo approccio, ma ho letto che la gente di Apache suggerisce di avere solo un'istanza per app per motivi di prestazioni.

Visivamente, quello che abbiamo fatto prima è stata questa:

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

Ora, facciamo questo:

Activity1 ... ActivityN 
    |    | 
    |    | 
HttpClient1 HttpClientN 

Come fate a fare questo nelle vostre applicazioni? Se condividi un singolo HttpClient nell'app e potenzialmente molti thread simultanei, come gestisci l'accesso ad esso?

+0

Potresti azzerare su quale approccio è migliore il primo (Singleton) o il secondo? –

+0

Io uso il primo approccio ora. Una factory si occupa solo dell'istanza di un'istanza, che quindi utilizza ThreadSafeConnManager per far fronte a richieste simultanee. Credo che sia così anche AndroidHttpClient (FroYo e nuovi livelli API). Funziona bene anche con framework DI come Guice. – Matthias

risposta

12

In poche parole:

creare un'istanza di org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager e utilizzarlo quando la costruzione di un DefaultHttpClient.

link per assaggiare fonte: HttpClient multithreaded access

Edit: Scusa, non ho visto la tua modifica prima di pubblicare. In questo caso non c'è nulla di intrinsecamente sbagliato in "Singleton".

+0

Ho letto (nel tutorial credo) che è perfettamente corretto mantenere un'istanza HttpClient statica. Immagino sia quello che farò allora. In questo modo posso sbarazzarmi del singleton e allo stesso tempo condividere un'istanza client attraverso l'app. – Matthias

+4

@Matthias: Se si sta eseguendo un singleton con 'HttpClient', quando si chiama' httpClient.getConnectionManager(). Shutdown(); '? – Macarse