【问题标题】:CookieManager - how to manage asynchronous method - removeSessionCookiesCookieManager - 如何管理异步方法 - removeSessionCookies
【发布时间】:2017-07-14 02:08:12
【问题描述】:

我需要将具有本机登录屏幕的应用程序与在 web 视图(混合应用程序)内运行的应用程序的其余部分集成。这听起来像是一种常见的方法,但我在将会话数据(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();

【问题讨论】:

    标签: android cookies asynchronous webview


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢 - 这是迄今为止我遇到的最清晰的信息。我觉得很奇怪为什么这些方法没有回调。
    • 这并不奇怪; WebView API 非常古老,唯一长时间使用它的应用程序是浏览器,它能够调用非公共/隐藏方法,因为它是平台的一部分。因此,有些 API 的边缘很粗糙,而且 Android 的兼容性要求很难改变。
    【解决方案2】:

    创建您自己的 java.net.CookieManager 实现,它将所有请求转发到 WebViews 的 webkit android.webkit.CookieManager。这意味着不需要同步,并且 HttpURLConnection 使用与 WebView 相同的 cookie 存储。

    Two way sync for cookies between HttpURLConnection (java.net.CookieManager) and WebView (android.webkit.CookieManager)

    【讨论】:

      猜你喜欢
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多