我需要集成一个具有本机登录屏幕的应用程序,并将其与运行在webview (混合应用程序)中的应用程序的其余部分结合起来。这听起来有点普通,但我在将会话数据(Cookie)从本地代码传输到and视图时遇到了问题,我认为这与CookieManager的异步行为有关。
有时,在某些设备上,cookies要么被删除,要么不应用。据我所读,这可能是因为removeSessionCookie、setCookie和sync在它们自己的线程中异步运行。在其他编程语言的Java中,我并不真正理解这一点,因为似乎没有任何钩子可以知道任务何时完成-- EG回调、事件、asyc/候候等。
因此,问题是,您如何知道何时在Android/Java中完成异步任务?我遇到了同步块语法,但它看起来不像是要等待removeSessionCookie这样的东西才能完成。
我的代码看起来有点像这样:
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeSessionCookie(); // problem
CookieSyncManager.getInstance().sync(); // maybe problem
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
for (int i = 0; i < cookies.size(); i++) {
Cookie cookie = cookies.get(i);
String cookieString = cookie.getName() + "=" + cookie.getValue();
cookieManager.setCookie(url, cookieString);
}
CookieSyncManager.getInstance().sync();发布于 2013-12-04 12:33:13
不幸的是,CookieManager API的设计使得这很困难/不可能。CookieSyncManager在这里根本不相关;它只处理内存中的cookie数据库和存储在磁盘上的数据库之间的同步。在它上调用sync()没有任何区别;WebView和CookieManager都已经共享了内存中的数据库,并且在实际执行时会立即看到对方的更改。
通常,异步方法会提供某种回调或等待它完成的方式,但removeSessionCookie()就是没有。实际上,在某些版本的代码中实现了这种方法--从蜂巢到JB--但是它不是一个公共WebView方法,您必须通过反射访问它,而且它不能在KK和上面的新WebView上工作。如果你真的想叫它,它是void waitForCookieOperationsToComplete(),但我不建议它。
你为什么一开始就打电话给removeSessionCookie()?最简单的修复方法是不使用它;其余的CookieManager API的行为与您预期的一样。您也不需要显式地调用CookieSyncManager.sync()。你是有问题导致你添加这些电话,还是你从某个地方复制它们?
如果您支持较早的操作系统版本,这就更加复杂了;从Cup蛋糕到姜饼,CookieManager使用的网络堆栈是不同的,API的行为也不同,因此这里实际上有三个版本要针对:直到姜饼,蜂窝通过Jellybean,然后是KitKat和后来的版本。
发布于 2014-04-03 16:13:49
创建您自己的java.net.CookieManager实现,它将所有请求转发到WebViews的webkit android.webkit.CookieManager。这意味着不需要同步,HttpURLConnection使用与WebViews相同的cookie存储。
https://stackoverflow.com/questions/20338573
复制相似问题