在最近使用新浪微博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隐式授权部分的一个代码逻辑问题...相关推荐

  1. 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 添加了以 ...

  2. OAuth2:隐式授权(Implicit Grant)类型的开放授权

    适用范围 仅需临时访问的场景 用户会定期在API提供者那里进行登录 OAuth客户端运行在浏览器中(Javascript.Flash等) 浏览器绝对可信,因为该类型可能会将访问令牌泄露给恶意用户或应用 ...

  3. 7.Java中变量的隐式转换以及强类型转换

    1.变量的相加,(变量的数据类型一致),直接运算即可!          结论:         Java中变量的 隐式转换(数据类型的默认类型提升)         byte,short,char- ...

  4. sql server 中的数据类型隐式转换

    数据类型转换分为隐式转换和显示转换 1)显示转换顾名思义使用函数进行数据类型转化,如cast.convert cast 和convert的区别 CAST( expression AS data_typ ...

  5. 【Android 应用开发】使用蒲公英 SDK 收集崩溃日志信息 ( 导入依赖 | 申请 Key | 集成代码 | 清单文件配置 | 手动上传日志 | 手动检查更新 )

    文章目录 一.导入依赖 二.申请 API Key 和 FrontJS Token 三.Application 集成 PgyerSDKManager 代码 四.AndroidManifest.xml 清 ...

  6. Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)

     运行有问题或需要源码请点赞关注收藏后评论区留言~~ 显示Intent和隐式Intent Intent是各个组件之间的信息沟通的桥梁,既能在Activity之间沟通,又能在Activity与Servi ...

  7. win8运行matlab7.0,Win8.1系统中matlab7.0不兼容的解决方法

    Win8.1系统中matlab7.0不兼容的解决方法 作者:深度技术员 文章来源:未知 发布时间:2018-02-23 15:08 matlab7.0是一款商业数学软件,很多win8.1系统由于学习或 ...

  8. JS中相等运算符 == 隐式转换

    原代码片段: var a = [] console.log(a == 0)//true console.log(!a == 0)//true复制代码 ​ a == 0 相当于执行了 Number(a. ...

  9. 从字节码看java中 this 的隐式传参

    从字节码看java中 this 隐式传参具体体现(和python中的self如出一辙,但是比python中藏得更深),也发现了 static 与 非 static 方法的区别所在! static与非s ...

最新文章

  1. 简述BT下载技术及其公司发展现状
  2. 查看TCP进程各状态连接数 IP封掉 的两个脚本
  3. 雷达篇(九)雷达中的“快采样”和“慢采样”
  4. 2.11 while循环的嵌套以及应用(难)
  5. sniffer 工具
  6. Directx11教程(55) 建立球形和锥形物体
  7. 后端:C#操作Mongodb用法笔记
  8. MAT(Memory Analyzer Tool)工具入门介绍
  9. Oracle ADF开发实战指南pdf
  10. oracle表update在等待,Oracle中如何更新一张大表记录
  11. 阿里云短信验证码平台使用demo
  12. DIV+CSS图片和文字如何显示同一行
  13. LeetCode 每日一题331. 验证二叉树的前序序列化
  14. 惠普笔记本电脑重装系统后找不到引导设备
  15. visual studio code输入感叹号没有提示
  16. https证书异常是什么意思?
  17. 信息系统项目管理师核心考点(五十五)配置管理员(CMO)的工作
  18. JME 3 入门教程 3 - Hello Assets
  19. 静心戒躁--半个学期来的小结
  20. .Net 全球化应用(Global):中英文翻译(附:谷歌在线翻译代码)

热门文章

  1. rust如何在木板上上传图片_RUST腐蚀的佛系与道系 看看你是个啥?
  2. 面试官:谈谈你对双亲委派模型的理解?
  3. Mina Logging Filter日志过滤器知识介绍
  4. 小米iot业务_小米:海外市场和IOT业务驱动公司2019年营收达到2058亿元
  5. 全网最全脚本整理,优秀学习范例汇集 —— VBS脚本、BAT脚本(批处理)公开、免费下载
  6. 【小程序源码】王者荣耀神器助手
  7. Unity 实现贴花/投影效果
  8. The driver has not received any packets from the server,java.net.ConnectException: Connection refuse
  9. c语言和python哪个更适合初学者?
  10. 完美解决原型和原型链理解问题