2010-11-10 19 views
37

AGGIORNAMENTO: questa domanda e le sue risposte non dovrebbero essere più raccomandate a chiunque stia leggendo questo. Android no-longer recommends HttpClient (read: deprecated), and instead recommends HttpUrlConnection. Un buon esempio di librerie da utilizzare ora sono Retrofit e OkHttp. Nel contesto di questa domanda, i cookie possono essere salvati, archiviati e consegnati con query successive. Questo non è gestito in modo trasparente. Con OkHttp you can use Interceptors.Cookie persistenti HttpClient Android

Ho un'applicazione Android con più intenti.

Il primo intento è un modulo di accesso, gli intenti successivi si basano sui cookie forniti dal processo di accesso.

Il problema che sto avendo è che i cookie non sembrano persistere attraverso gli intenti. Sto creando nuovi HttpClients in ogni intento (inizialmente ho provato a Parcelable a trasmetterlo a ogni intento, che non ha funzionato così bene).

Qualcuno ha qualche suggerimento per rendere i cookie persistenti attraverso gli intent?

+0

Per inciso, la più vicina che ho trovato è quello di scrivere la cookiestore in preferenze condivise. – Knossos

+0

Per concludere questa discussione, sono riuscito nella mia ricerca creando la mia classe HttpClient con i metodi per impostare e ottenere il suo CookieStore. Ho fatto in modo che, inizializzando il client, recuperi automaticamente tutti i cookie da SharedPreferences. Inoltre, prima di ogni nuova creazione di Intent o di quella corrente, tutti i cookie vengono copiati in SharedPreferences. – Knossos

risposta

31

È possibile eseguire ciò che @Emmanuel ha suggerito oppure è possibile passare lo BasicHttpContext tra gli HttpClients che si stanno creando.

Esempio L'utilizzo di contesto e biscotti, complete code here

HttpClient httpclient = new DefaultHttpClient(); 

    // Create a local instance of cookie store 
    CookieStore cookieStore = new BasicCookieStore(); 

    // Create local HTTP context 
    HttpContext localContext = new BasicHttpContext(); 
    // Bind custom cookie store to the local context 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

    HttpGet httpget = new HttpGet("http://www.google.com/", localContext); 
+0

Grazie per l'informazione, questa sembra essere la scelta migliore per me. – Knossos

22

Non creare nuovi HttpClients; questo cancellerà i cookie. Riutilizzare un singolo HttpClient.

+0

così posso rendere il httpclient statico. – Senthil

+0

@ vsk: Sì. Ad esempio, potresti utilizzare un Singleton. Generalmente creo un Singleton ConnectionHelper in cui posso serializzare le richieste al server. – Emmanuel

4

Fai la tua HttpClient una classe Singleton.

4

definire HttpClient nella classe Application e utilizzare l'attività.

in applicazione

public class AAA extends Application { 
    public HttpClient httpClient; 

    httpClient = new DefaultHttpClient(); 

in attività

AAA aaa = (AAA)getApplication(); 
httpClient = app.httpClient; 
+1

Questa risposta è buona! Perché downvote? –

+0

Non hai il controllo sullo stato dell'applicazione, se lo usi assicurati di fare un controllo null o un metodo in AAA per ottenere il Cliente con questo controllo. – DagW

Problemi correlati