android新浪微博oauth2.0,新浪微博 Android SDK中OAuth2.0隐式授权部分的一个代码逻辑问题...
在最近使用新浪微博android sdk开发微博登录的时候,从日志中发现一个问题,就是自定义的WeiboDialogListener里面的方法,比如onComplete或者onCancel等,经常会被两次调用,这样其实会导致一些隐性问题,比如增加额外的客户端和服务端的开销,因为我们通常会在onComplete()里面完成更多后续逻辑的处理,而发生这样的情况时,会被处理两次,一开始我犯懒,就在方法外面加入了一个变量 isCompleted 来进行判断,算是暂时解决了问题,后来在好几个地方要开发类似功能的时候,总感觉心里有点儿不爽,于是决定找找到底啥原因
看了看微博sdk里面的代码,在 WeiboDialog.java里面找到了问题,这个java文件主要实现的是创建OAuth的UI,并且通过实现和调用WebViewClient的方法来访问微博的api以及咱们app的callback url, 进而通过WebViewClient里面捕获当前请求的URL,分析URL参数后进行相应逻辑的判断,通过分析,问题应该是在这部分。
在WeiboDialog.java里面有个函数 handleRedirectUrl(),这个函数就是用来判断认证和授权过程中返回参数的,代码如下:
[coolcode lang=”java”]
private void handleRedirectUrl(WebView view, String url) {
Bundle values = Utility.parseUrl(url);
String error = values.getString(“error”);
String error_code = values.getString(“error_code”);
if (error == null && error_code == null) {
mListener.onComplete(values);
} else if (error.equals(“access_denied”)) {
// 用户或授权服务器拒绝授予数据访问权限
mListener.onCancel();
} else {
mListener.onWeiboException(new WeiboException(error, Integer.parseInt(error_code)));
}
}
[/coolcode]
一看就知道啥意思了,关键的逻辑就在这里面,回调我们自己实现的WeiboDialogListener里面的方法,顺藤摸瓜,调用该方法的代码就在实现WebViewClient里面,研究了一下该部分代码,找到了原因
在WebViewClient中,我们需要实现至少shouldOverrideUrlLoading()方法,该方法在每次加载新url的时候调用,另外,我们还通常会实现onPageStarted()方法,该方法也是在新url开始加载的时候进行调用(注意:在frame里面加载是不会调用的,详细文档见http://developer.android.com/reference/android/webkit/WebViewClient.html)
在WeiboDialog.java实现WebViewClient对象的时候,在shouldOverrideUrlLoading()和onPageStarted()里面都同时调用了handleRedirectUrl()来进行回调url和参数的判断,结果就导致了我遇到的问题,于是我们可以把里面的一个去掉,或者增加一个参数来进行判断,避免重复调用,目前一切正常了!
android新浪微博oauth2.0,新浪微博 Android SDK中OAuth2.0隐式授权部分的一个代码逻辑问题...相关推荐
- play-services-tasks (com.google.android.gms:play-services-tasks)”的开发者向 SDK 版本 18.0.0
"play-services-tasks (com.google.android.gms:play-services-tasks)"的开发者向 SDK 版本 18.0.0 添加了以 ...
- OAuth2:隐式授权(Implicit Grant)类型的开放授权
适用范围 仅需临时访问的场景 用户会定期在API提供者那里进行登录 OAuth客户端运行在浏览器中(Javascript.Flash等) 浏览器绝对可信,因为该类型可能会将访问令牌泄露给恶意用户或应用 ...
- 7.Java中变量的隐式转换以及强类型转换
1.变量的相加,(变量的数据类型一致),直接运算即可! 结论: Java中变量的 隐式转换(数据类型的默认类型提升) byte,short,char- ...
- sql server 中的数据类型隐式转换
数据类型转换分为隐式转换和显示转换 1)显示转换顾名思义使用函数进行数据类型转化,如cast.convert cast 和convert的区别 CAST( expression AS data_typ ...
- 【Android 应用开发】使用蒲公英 SDK 收集崩溃日志信息 ( 导入依赖 | 申请 Key | 集成代码 | 清单文件配置 | 手动上传日志 | 手动检查更新 )
文章目录 一.导入依赖 二.申请 API Key 和 FrontJS Token 三.Application 集成 PgyerSDKManager 代码 四.AndroidManifest.xml 清 ...
- Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
运行有问题或需要源码请点赞关注收藏后评论区留言~~ 显示Intent和隐式Intent Intent是各个组件之间的信息沟通的桥梁,既能在Activity之间沟通,又能在Activity与Servi ...
- win8运行matlab7.0,Win8.1系统中matlab7.0不兼容的解决方法
Win8.1系统中matlab7.0不兼容的解决方法 作者:深度技术员 文章来源:未知 发布时间:2018-02-23 15:08 matlab7.0是一款商业数学软件,很多win8.1系统由于学习或 ...
- JS中相等运算符 == 隐式转换
原代码片段: var a = [] console.log(a == 0)//true console.log(!a == 0)//true复制代码 a == 0 相当于执行了 Number(a. ...
- 从字节码看java中 this 的隐式传参
从字节码看java中 this 隐式传参具体体现(和python中的self如出一辙,但是比python中藏得更深),也发现了 static 与 非 static 方法的区别所在! static与非s ...
最新文章
- 简述BT下载技术及其公司发展现状
- 查看TCP进程各状态连接数 IP封掉 的两个脚本
- 雷达篇(九)雷达中的“快采样”和“慢采样”
- 2.11 while循环的嵌套以及应用(难)
- sniffer 工具
- Directx11教程(55) 建立球形和锥形物体
- 后端:C#操作Mongodb用法笔记
- MAT(Memory Analyzer Tool)工具入门介绍
- Oracle ADF开发实战指南pdf
- oracle表update在等待,Oracle中如何更新一张大表记录
- 阿里云短信验证码平台使用demo
- DIV+CSS图片和文字如何显示同一行
- LeetCode 每日一题331. 验证二叉树的前序序列化
- 惠普笔记本电脑重装系统后找不到引导设备
- visual studio code输入感叹号没有提示
- https证书异常是什么意思?
- 信息系统项目管理师核心考点(五十五)配置管理员(CMO)的工作
- JME 3 入门教程 3 - Hello Assets
- 静心戒躁--半个学期来的小结
- .Net 全球化应用(Global):中英文翻译(附:谷歌在线翻译代码)
热门文章
- rust如何在木板上上传图片_RUST腐蚀的佛系与道系 看看你是个啥?
- 面试官:谈谈你对双亲委派模型的理解?
- Mina Logging Filter日志过滤器知识介绍
- 小米iot业务_小米:海外市场和IOT业务驱动公司2019年营收达到2058亿元
- 全网最全脚本整理,优秀学习范例汇集 —— VBS脚本、BAT脚本(批处理)公开、免费下载
- 【小程序源码】王者荣耀神器助手
- Unity 实现贴花/投影效果
- The driver has not received any packets from the server,java.net.ConnectException: Connection refuse
- c语言和python哪个更适合初学者?
- 完美解决原型和原型链理解问题