android上WebView设置cookie,以及设置webview cookie在部分手机失效
来源:互联网 发布:淘宝女装海报图片 编辑:程序博客网 时间:2024/05/26 12:56
这是在网上抄的cookie设置方案,在android 5.0系统上测试时正常在,在部分4.X手机上测试有时会失效
(我使用的测试机为中兴 ZTE android版本4.3 )
public void cookie(Context context,String url,String value) { try { CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.removeSessionCookie(); cookieManager.setCookie(url,value); CookieSyncManager.getInstance().sync(); } catch (Exception e) { e.printStackTrace(); } }
最终解决方案是
http://code.walletapp.net/post/46414301269/passing-cookie-to-webview
但是解决问题的人回答是
In few following lines I will describe my solution, how to pass cookies from DefaultHttpClient to WebView component. I was following many tutorials, but cookies weren’t send to WebView properly (in my Android 2.2). After several experiments I found out that it is working, when we wait a little time between removeSessionCookie and setCookie methods. I don’t know why. But important is, that it is working right now for me.
在removeSessionCookie和setCookie方法之间需要加入等待时间,设置cookie成功,但是不知道为什么。
解决方案是等待了1000毫秒,实际应该不需要这么长的时间
我们去android 源码在线网站上看看
http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/
在android 4.0上removeSeesionCookie的代码 开启了AsyncTask的异步任务处理cookie。也就是说removeSeesionCookie这段代码是在4.0的系统上异步的
所以cookieManager.removeSeesionCookie() 异步会导致删除setcookie的内容,所以有时成功有时失败
public void More ...removeSessionCookie() {610 signalCookieOperationsStart();//某个变量值+1611 if (JniUtil.useChromiumHttpStack()) {612 new AsyncTask<Void, Void, Void>() {613 protected Void More ...doInBackground(Void... none) {614 nativeRemoveSessionCookie(); //移除本地所有会话的cookie615 signalCookieOperationsComplete();//某个变量值-1 并断言 相当于log616 return null;617 }618 }.execute();//启动异步任务619 return;620 }621 622 final Runnable clearCache = new Runnable() {623 public void More ...run() {624 synchronized(CookieManager.this) { //移除所有内存中的cookie映射625 Collection<ArrayList<Cookie>> cookieList = mCookieMap.values();626 Iterator<ArrayList<Cookie>> listIter = cookieList.iterator();627 while (listIter.hasNext()) {628 ArrayList<Cookie> list = listIter.next();629 Iterator<Cookie> iter = list.iterator();630 while (iter.hasNext()) {631 Cookie cookie = iter.next();632 if (cookie.expires == -1) {633 iter.remove();634 }635 }636 }637 CookieSyncManager.getInstance().clearSessionCookies();//清空所有会话的cookie638 signalCookieOperationsComplete();639 }640 }641 };642 new Thread(clearCache).start();//启动线程643 }
另外4.X的CookieManager的sync()也是异步的 以下是代码段
开启一个mHandler(SyncHandler)等待100毫秒 调用 syncFlushCookieStor()->flushCookieStore()->nativeFlushCookieStore() (这句才是真正将cookiet同步的代码)
public void More ...sync() {97 if (DebugFlags.WEB_SYNC_MANAGER) {98 Log.v(LOGTAG, "*** WebSyncManager sync ***");99 }100 if (mHandler == null) {101 return;102 }103 mHandler.removeMessages(SYNC_MESSAGE);104 Message msg = mHandler.obtainMessage(SYNC_MESSAGE);105 mHandler.sendMessageDelayed(msg, SYNC_NOW_INTERVAL); //等待<span style="font-family: 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif;">SYNC_NOW_INTERVAL=</span><span style="font-family: 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif;">100毫秒</span>106 }
private class More ...SyncHandler extends Handler {47 @Override48 public void More ...handleMessage(Message msg) {49 if (msg.what == SYNC_MESSAGE) {50 if (DebugFlags.WEB_SYNC_MANAGER) {51 Log.v(LOGTAG, "*** WebSyncManager sync ***");52 }53 syncFromRamToFlash();54 55 // send a delayed message to request sync later56 Message newmsg = obtainMessage(SYNC_MESSAGE);57 sendMessageDelayed(newmsg, SYNC_LATER_INTERVAL);58 }59 }60 }
protected void More ...syncFromRamToFlash() { if (DebugFlags.COOKIE_SYNC_MANAGER) { Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash STARTS"); } CookieManager manager = CookieManager.getInstance(); if (!manager.acceptCookie()) { return; } manager.flushCookieStore(); if (DebugFlags.COOKIE_SYNC_MANAGER) { Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash DONE"); } }
在android5.0系统上Sync回调用flush()方法
@Deprecated115 protected void More ...syncFromRamToFlash() {116 CookieManager.getInstance().flush();117 }
另外android 5.0官方文档上面也说明了
The WebView now automatically syncs cookies as necessary. You no longer need to create or use the CookieSyncManager. To manually force a sync you can use the CookieManager method
which is a synchronous replacement for CookieManager.flush()
.sync()
webview现在必须自动同步cookie,你不再需要创建或使用cookiesyncmanager,你可以使用CookieManager的CookieManager.flush()方法,flush()是sync()同步置换
结论在android4.X系统下面cookiesyncmanager的方法有些事异步的,removeSeesionCookie()和sync()要等待100毫秒。
而在android5.0以上的系统Cookie是同步的,sync=flush方法,调用CookieManager.flush()就是同步设置cookie。
- android上WebView设置cookie,以及设置webview cookie在部分手机失效
- android上WebView设置cookie,以及设置webview cookie在部分手机失效
- Android在webview上设置cookie,部分cookie失效的问题
- 【Android】WebView设置Cookie
- android webview 设置 Cookie
- Android WebView设置cookie
- 在Android WebView中设置Cookie
- android webview里设置cookie
- android webview里设置cookie
- android webview里设置cookie
- android webview里设置cookie
- iOS 设置webView cookie
- webView设置cookie
- webView设置Cookie
- WebView设置Cookie
- Android webview 写入cookie的解决方法以及一些属性设置
- 在Android的WebView中给一级域名设置cookie
- Android(安卓)WebView设置cookie
- 欢迎使用CSDN-markdown编辑器
- o o命名标准
- xiangmu--WAD
- Volley的基本用法
- Node.js入门学习(概述)
- android上WebView设置cookie,以及设置webview cookie在部分手机失效
- 在onCreate时获取view的宽高
- extern 关键字
- PDO防止sql注入的机制
- 查询手机或邮箱注册过哪些网站
- Xcode中将图片放到images.xcassets中的好处
- static 静态方法 有什么优缺点 PHP中静态方法(static)与非静态方法的使用及区别
- java基础知识总结9(数据库篇2)
- Java中Random类的nextInt()方法详解