如何使用HttpClient在android中维护会话

时间:2013-09-14 13:25:56

标签: android session

我使用HttpClient建立服务器连接,如下所示:

DefaultHttpClient client = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.example.com/login");
HttpResponse response = client.execute(httppost);

服务器会话使用 cookies

为了维护会话,我必须为所有后续连接使用相同的客户端。我正在做的工作正常。

但问题是,在android中,通常Activity数据在有需要时被销毁,这也会破坏HttpClient(当我的应用程序在baclground中时),因此会话丢失。

有没有办法让HttpClient持续存在?或者我该如何解决这个问题?

谢谢。

2 个答案:

答案 0 :(得分:1)

我知道无法保存会话并在活动重新启动后重新创建。

唯一的方法是将您的HttpClient代码放入服务。通过这种方式,您可以玩活动,不用担心会话中断。

您可以找到Services文档here

  

服务器会话使用cookie。

对于Android默认情况下启用Cookie,您无需担心。

您肯定可以存储Cookie,但我不知道它可以帮助您以某种方式解决您的问题。

无论如何,这是一种获取Cookie的技术:

List<Cookie> mCookies = null;

mCookies = httpclient.getCookieStore().getCookies();

        if (mCookies.isEmpty()) {
            Log.d("test_runner", "Cookies: None");
        } else {
            for (int i = 0; i < mCookies.size(); i++) {
                System.out.println("- " + mCookies.get(i).toString());
                Log.d("test_runner", "Cookies: [" + i + "]" + mCookies.get(i).toString());
            }
        }

这是一种如何将它们放回去的方式:

 CookieStore cookieStore = new BasicCookieStore(); 

     for(Cookie cook : mCookies){
         cookieStore.addCookie(cook); 
     }

     httpclient = new DefaultHttpClient(params);
     httpclient.setCookieStore(cookieStore);

答案 1 :(得分:0)

最好的想法是将服务器所执行的所有功能放在将要连接的任务调用的唯一类中。我将此类称为WebServiceManager。该类与服务器具有完全相同的方法。

如你想要一个独特的会话那么:

private static WebServiceManager wsm = null;

public static WebServiceManager getInstance() {
    if (wsm == null) {
        wsm = new WebServiceManager();
    }
    return wsm;
}

private final HttpClient httpClient;

private WebServiceManager() {
    httpClient=new DefaultHttpClient();
}

然后你调用你的webServiceManager实例的方法来使用相同的httpclient并保留你的cookie。 :)