2010-11-10 106 views
37

更新:此問題及其答案不應再推薦給任何閱讀此內容的人。 Android no-longer recommends HttpClient (read: deprecated), and instead recommends HttpUrlConnection。現在使用庫的一個很好的例子是RetrofitOkHttp。在這個問題的上下文中,cookies可以被保存,存儲並隨後進行查詢。這不是透明處理的。與OkHttp you can use InterceptorsAndroid HttpClient持久性Cookie

我有一個Android應用程序有多個意圖。

第一個意圖是登錄表單,後續意圖依賴於登錄過程中提供的cookie。

我遇到的問題是,Cookie似乎並沒有持續存在於意圖之中。我在每個意圖中創建新的HttpClient(我最初嘗試將Parcelable傳遞給每個意圖,但這並不能很好地工作)。

有沒有人有任何提示使cookie在整個意圖中持續存在?

+0

順便提及,我已發現最接近的是寫出來的的CookieStore到共享首選項。 – Knossos 2010-11-10 17:04:09

+0

爲了結束這次討論,我成功地通過創建自己的HttpClient類來設置和獲取CookieStore。我這樣做是爲了在初始化客戶端時自動從SharedPreferences中檢索所有的Cookie。另外,在每次創建新的Intent或當前的Intent完成之前,所有Cookie都將被複制到SharedPreferences中。 – Knossos 2010-11-16 14:29:46

回答

31

您可以執行@Emmanuel建議的操作,或者您可以在您創建的HttpClient之間通過BasicHttpContext

背景和餅乾的使用示例: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

感謝您的信息,這似乎是我的最佳選擇。 – Knossos 2010-11-11 16:36:55

22

不要創建新的HttpClient;這將清除cookie。重用一個HttpClient。

+0

所以我可以使httpclient爲靜態。 – Senthil 2013-05-25 05:41:18

+0

@vsk:是的。例如,你可以使用Singleton。我通常創建一個ConnectionHelper Singleton,我可以將請求序列化到服務器。 – Emmanuel 2013-05-27 18:09:54

4

讓你HttpClient的一個單獨的類。

4

在Application類中定義HttpClient,並使用活動。

在應用

public class AAA extends Application { 
    public HttpClient httpClient; 

    httpClient = new DefaultHttpClient(); 

在活動

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

這個答案很好!爲什麼downvote? – 2013-04-24 09:26:48

+0

您無法控制應用程序的狀態,如果您使用此操作,請確保在AAA中執行空值檢查或方法以獲取帶有此檢查的客戶端。 – DagW 2013-05-21 09:14:33