为什么当我关闭Android应用程序时cookie会丢失?

为什么当我关闭Android应用程序时cookie会丢失?,android,cookies,Android,Cookies,我正在开发一个Android应用程序,我对这个有点陌生。我目前试图做的是维护一个登录的用户。要登录,我必须向API发出请求,并向用户发送电子邮件和密码,这将返回一个我管理得很好的JSONObject。我有一个CookieStore变量来获取cookies并将它们存储到我的共享参考资料中 我刚刚意识到,如果我关闭应用程序,我的cookie就会丢失,即使应用程序恢复,我也需要继续向API发出请求,因为用户已经登录。我尝试在我的一个活动的onResume()方法中“还原”cookies,但这并没有按我

我正在开发一个Android应用程序,我对这个有点陌生。我目前试图做的是维护一个登录的用户。要登录,我必须向API发出请求,并向用户发送电子邮件和密码,这将返回一个我管理得很好的JSONObject。我有一个CookieStore变量来获取cookies并将它们存储到我的共享参考资料中

我刚刚意识到,如果我关闭应用程序,我的cookie就会丢失,即使应用程序恢复,我也需要继续向API发出请求,因为用户已经登录。我尝试在我的一个活动的onResume()方法中“还原”cookies,但这并没有按我希望的方式工作。如果我尝试在恢复应用程序后使用CookieStore.getCookies()获取cookies,则列表为null

有人告诉我,我可以使用loopj的
AsynHttpClient
并使用
PersistentCookieStore
管理我的cookies,但这不会让我遇到同样的问题吗?每次恢复应用程序时,我都会失去PersistentCookieStore实例的价值,对吗

所以我的问题是:

如何恢复cookie以保持其持久性,并使我能够继续向API发出请求?

希望有人能帮我

提前感谢。

您有两个选择:

选项1-如果使用SharedReferences和HttpUrlConnection:使用HttpUrlConnection时,需要手动从SharedReferences检索cookie,并将cookie添加到每个请求中

选项2-如果使用loopj AsyncHttpClient:根据loopj文档,每次重新启动应用程序时,必须创建PersistentCookieStore的实例并将其添加到AsyncHttpClient,如下所示

AsyncHttpClient myClient = new AsyncHttpClient();
PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
myClient.setCookieStore(myCookieStore);

其中“this”是一个上下文。

您如何在SharedReference中存储/恢复cookie?你能分享一些代码吗? 您还可以试着调试一下,告诉我们它有什么问题吗?它是否未存储到SharedReferences?它不能恢复它们吗


在将CookieStore存储存储/还原到SharedReferences之前,您需要首先使用它创建一个可序列化的对象,例如
ArrayList使用SharedReferences存储它应该可以工作。你可以随时取回它。是的,但它没有。问题是,如果我关闭应用程序并尝试向API发出新请求,我无法告诉API我是同一个用户,因为我丢失了cookie。我是否应该在发出请求时从共享首选项中恢复它们?我需要饼干的哪些信息?名称、值、域、路径和版本?sharepreferences将起作用。检索cookie并将其发送到服务器谢谢!我最终使用了loopj AsyncHttpClient,它工作得很好:)
public static void storeCookies(Context context, CookieStore cookieStore) {
  ArrayList<HashMap<String, String> cookies = new ArrayList<HashMap<String, String>();
  for (Cookie cookie : cookieStore.getCookies()) {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("name", cookie.getName());
    map.put("path", cookie.getPath());
    map.put("domain", cookie.getDomain());
    map.put("expiry_date", cookie.getExpiryDate());
    map.put("ports", cookie.getPorts());
    map.put("value", cookie.getValue());
    map.put("version", cookie.getVersion());
    ...
    // Add all the fields you want to save
    cookies.add(map);
  }

  SharedPreferences.Editor editor = context.getSharedPreferences().edit();
  editor.putSerializable("cookies", cookies).apply();
}

public static void addCookiesToStore(Context context, CookieStore cookieStore) {
  List<Map<String, String>> cookies = (ArrayList<HashMap<String, String>>) context.getSharedPreferences().getSerializable("cookies");

  for (Cookie map : cookieStore.getCookies()) {
    Cookie cookie = new BasicClientCookie(map.getName(), map.getValue());
    cookie.setPath(map.get("path));
    ...
    // Add all the fields you want to restore
    cookieStore.add(cookie);
  }
}