2010-11-10 109 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