1

我正在使用一个HttpClient来建立服务器连接,如下所示:

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

服务器会话与cookie一起使用。

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

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

有没有办法使HttpClient持久?或者我该如何解决这个案子?

谢谢你。

4

2 回答 2

1

据我所知,无法保存您的会话并在 Activity 重新启动后重新创建。

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

你可以在 这里Services找到文档

服务器会话使用 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);
于 2013-09-14T13:38:37.460 回答
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。:)

于 2014-05-19T09:00:57.667 回答