2010-11-10 21 views
37

UPDATE: Diese Frage und ihre Antworten sollten nicht mehr jedem empfohlen werden, der dies liest. Android no-longer recommends HttpClient (read: deprecated), and instead recommends HttpUrlConnection. Ein gutes Beispiel für Bibliotheken, die jetzt verwendet werden können, sind Retrofit und OkHttp. Im Rahmen dieser Frage können Cookies gespeichert, gespeichert und mit nachfolgenden Abfragen geliefert werden. Dies wird nicht transparent gehandhabt. Mit OkHttp you can use Interceptors.Android HttpClient persistente Cookies

Ich habe eine Android-Anwendung mit mehreren Absichten.

Die erste Absicht ist ein Login-Formular, nachfolgende Absichten beruhen auf Cookies, die vom Login-Prozess bereitgestellt werden.

Das Problem, das ich habe, ist, dass Cookies nicht über die Absichten bestehen bleiben. Ich erstelle neue HttpClients in jeder Absicht (ich versuchte anfangs, Parcelable zu jeder Absicht zu übertragen, die nicht so gut funktionierte).

Hat jemand irgendwelche Tipps, um Cookies dauerhaft über alle Absichten hinweg zu machen?

+0

Im übrigen ist die nächste, die ich gefunden habe, ist die cookiestore in gemeinsamer Prefs zu schreiben. – Knossos

+0

Um diese Diskussion zu beenden, ist es mir gelungen, meine eigene HttpClient-Klasse mit Methoden zum Festlegen und Abrufen des CookieStore zu erstellen. Ich habe es so gemacht, dass es beim Initialisieren des Clients automatisch alle Cookies von SharedPreferences abruft. Vor jedem Erstellen eines neuen Intents oder dem Abschluss eines neuen Intent werden alle Cookies in SharedPreferences kopiert. – Knossos

Antwort

31

Sie können tun, was @ Emmanuel vorgeschlagen hat, oder Sie können die BasicHttpContext zwischen den HttpClients übergeben, die Sie erstellen.

Beispiel Verwendung von Kontext und Cookies, 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

Danke für die Information, das scheint die beste Wahl für mich zu sein. – Knossos

22

Erstellen Sie keine neuen HttpClients; Dadurch werden die Cookies gelöscht. Wiederverwendung eines einzelnen HttpClient.

+0

also kann ich den httpclient als statisch machen. – Senthil

+0

@vsk: Ja. Sie könnten zum Beispiel einen Singleton verwenden. Ich erstelle normalerweise einen ConnectionHelper Singleton, mit dem ich Anfragen an den Server serialisieren kann. – Emmanuel

4

Machen Sie Ihre Httpclient eine Singleton-Klasse.

4

Definieren Sie HttpClient in der Anwendungsklasse und verwenden Sie Aktivität.

in Anwendung

public class AAA extends Application { 
    public HttpClient httpClient; 

    httpClient = new DefaultHttpClient(); 

in Aktivität

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

Diese Antwort ist gut! Warum runterstimmen? –

+0

Sie haben keine Kontrolle über den Status der Anwendung, wenn Sie dies verwenden, stellen Sie sicher, eine Null-Überprüfung oder eine Methode in AAA durchzuführen, um den Client mit dieser Überprüfung zu erhalten. – DagW