gpt4 book ai didi

android - CookieManager - 如何管理异步方法 - removeSessionCookies

转载 作者:太空狗 更新时间:2023-10-29 16:39:30 25 4
gpt4 key购买 nike

我需要将一个具有 native 登录屏幕的应用程序与在 web View (混合应用程序)内运行的应用程序的其余部分集成。这听起来像是一种常见的方法,但我在将 session 数据(cookie)从 native 代码传输到 webview 时遇到了问题,我认为这与 CookieManager 的异步行为有关。

有时,在某些设备上,cookie 会被删除或不应用。据我所知,这可能是因为 removeSessionCookie、setCookie 和 sync 在它们自己的线程中异步运行。我不太理解来自其他编程语言的 Java 中的这一点,因为似乎没有任何钩子(Hook)可以知道任务何时完成,例如 EG 回调、事件、asyc/await 等。

所以问题是您如何知道在 Android/Java 中异步任务何时完成?我遇到过同步块(synchronized block)语法,但它看起来不会等待像 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();

最佳答案

不幸的是,CookieManager API 设计使这变得困难/不可能。 CookieSyncManager 在这里完全不相关;它只处理内存中 cookie 数据库和存储在磁盘上的 cookie 数据库之间的同步。在其上调用 sync() 不会有任何区别; WebViewCookieManager 都已经共享内存数据库,并且在实际进行更改时立即看到彼此的更改。

通常,异步方法会提供某种回调或方法来等待它完成,但 removeSessionCookie() 不会。实际上在某些版本的经典 WebView(从 Honeycomb 到 JB)的代码中实现了这样一个方法,但它不是公共(public) API 方法,您必须通过反射访问它,并且它不会在新的 WebView 上工作KK及以上。如果您真的想调用它,可以是 void waitForCookieOperationsToComplete(),但我不建议这样做。

为什么首先要调用 removeSessionCookie()?最简单的解决方法是不使用它; CookieManager API 的其余部分的行为与您预期的一样。您也不需要显式调用 CookieSyncManager.sync()。您是遇到问题导致添加这些调用,还是从某处复制了它们?

如果您支持较旧的操作系统版本,这会更加复杂;从 Cupcake 到 Gingerbread,CookieManager 使用的网络堆栈不同,API 的行为也不同,因此实际上这里有三个版本:直到 Gingerbread、Honeycomb 到 Jellybean,然后是 KitKat 和更高版本..

关于android - CookieManager - 如何管理异步方法 - removeSessionCookies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20338573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com