sub*_*sub 2 cookies android asynchronous webview
我需要将一个具有本机登录屏幕的应用程序与在 webview (混合应用程序)内运行的应用程序的其余部分集成。这听起来像是一种常见的方法,但我在将会话数据(cookie)从本机代码传输到 webview 时遇到问题,我认为这与 CookieManager 的异步行为有关。
有时,在某些设备上,cookie 要么被删除,要么不应用。据我所知,这可能是因为removeSessionCookie、setCookie 和sync 在它们自己的线程中异步运行。我不太理解来自其他编程语言的 Java 中的这一点,因为似乎没有任何钩子可以知道任务何时完成 EG 回调、事件、asyc/await 等。
那么问题是如何知道 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();
Run Code Online (Sandbox Code Playgroud)
不幸的是,CookieManagerAPI 设计使这变得困难/不可能。CookieSyncManager在这里根本不相关;它只处理内存中的 cookie 数据库和存储在磁盘上的数据库之间的同步。调用sync()它不会有任何区别;和WebView两者CookieManager已经共享内存数据库,并且在实际进行更改时立即看到彼此的更改。
通常,异步方法会提供某种回调或等待其完成的方式,但removeSessionCookie()事实并非如此。实际上,在经典 WebView 的某些版本(从 Honeycomb 直到 JB)的代码中确实实现了这样的方法,但它不是公共 API 方法,您必须通过反射访问它,并且它不适用于新的 WebView KK及以上。如果你真的想称呼它,那就是void waitForCookieOperationsToComplete(),但我不建议这样做。
removeSessionCookie()你首先为什么打电话?最简单的解决办法就是不使用它;API的其余部分CookieManager将按照您的预期运行。您也不需要CookieSyncManager.sync()显式调用。您是否遇到了导致您添加这些调用的问题,或者您是否从其他地方复制了它们?
如果您支持较旧的操作系统版本,这会更加复杂;从 Cupcake 到 Gingerbread,所使用的网络堆栈CookieManager不同,API 的行为也不同,因此这里实际上有三个目标版本:直到 Gingerbread、Honeycomb 到 Jellybean,然后是 KitKat 及更高版本。
| 归档时间: |
|
| 查看次数: |
2412 次 |
| 最近记录: |