Android

修复一个支付宝概率支付失败的问题

问题 App中一个遗留的bug,当用户使用支付宝进行支付时会概率出错.并且没有规律. 原因 对比支付宝的的url,发现部分参数中多了+号,程序中对url进行了URLDecoder.<em>decode</em>(url),导致空格变成了+号,从而导致支付宝报错.

快速的将Android-async-http升级到OKhttp

背景 Android-async-http已经不更新了。ps:还为这个库提交过功能https://github.com/android-async-http/android-async-http/pull/840 Android-async-http是基于HttpClient的。 替换方案 将项目中所有的请求代码都替换工作量巨大,也容易出问题。所以采用将Okhttp封装为Android-async-http的方式进行替换。 android-async-http的使用方法: 从代码可以看出,想要快速的替换需要: 1.使用okhttp来实现AsyncHttpClient 2.实现AsyncHttpResponseHandler,FileAsyncHttpResponseHandler,JsonHttpResponseHandler,TextHttpResponseHandler等项目中使用的Handler即可.

Android7,8的适配

背景 用户反馈华为Mate10 无法使用App。 升级 targetSdkVersion = 26 遇到的问题 网络请求异常 TransactionTooLargeException 通知渠道 FileUriExposedException Charles无法抓Https MODE_WORLD_READABLE no longer supported BadTokenException 7.1 Not allowed to start service getRunningServices deprecated in API level 26 As of O, this method is no longer available to third party applications. For backwards compatibility, it will still return the caller’s own services. ps:时间太长了想起来再写,详情有空再整理

一个bad request http request or invalid response的错误

问题 部分客户端api报错,特别是8.0系统上,访问api出现bad request http request or invalid response,from ulb错误。 解决步骤 1.服务器联调 服务器端未发现问题,参数都对。服务器上也没有这句错误信息。猜测应该是服务器上层报出来的错误,如负载均衡。 2.用Charles抓包 Charles抓包后,就不会出现该错误了。后来发现Charles对错误报文进行了兼容处理,发给服务器的应该对的。 3.去GIthub查网络库的issues 项目中使用的是,Android-async-http这个库,issues中没有人说8.0中有这个问题,猜想应该是自己代码中的问题。 4.大鲨鱼Wireshark抓包 大鲨鱼Wireshark抓包后会出现该错误,没有看出报文有异常。 比较正确的报文和错误的报文,发现大小不一样。 最终发现(找了好久,反正就是很艰难),错误的报文Header中多了一个空行。 原因 在往Header中添加参数时,有一个参数出现了\n,正常情况下客户端发送报文的时会忽略\n,而有的版本把\n放在了报文中,导致报文格式出错。

使用SVN下载GitHub单个目录内的文件

背景 有时候需要在GitHub上下载单个目录里面的文件,而不需要去克隆整个项目,太大的项目克隆起来太慢。 解决方案 GitHub是支持SVN访问的,所以可以使用SVN下载单个目录。 下载master分支 复制浏览器地址栏中的地址,如: https://github.com/bumptech/glide/tree/master/integration 将tree改为trunk即可。 https://github.com/bumptech/glide/trunk/integration 下载其他分支 如: https://github.com/bumptech/glide/tree/3.0/integration 将tree改为branches即可。 https://github.com/bumptech/glide/branches/3.0/integration 然后svn checkout 即可。

在Okhttp中使用HTTPDNS

背景 用户经常在国外使用App,国外的网络环境更加复杂,经常会出现UnknownHostException的异常,无法解析DNS。 解决方案 当遇到该异常时就需要自己去解析DNS。常用的自己解析DNS的方式有两种 1.自己拿到IP后替换域名(App老的方式) 比如使用dnsjava拿到IP后需要:

TransactionTooLargeException 的原因

问题 适配7.0时发生了TransactionTooLargeException的异常. 原因 1.Fragment关闭时会调用onSaveInstanceState,而在onSaveInstanceState中保存了比较大的数据. 2.调用fragment.setArguments(bundle)时,往bundle中放了过大的数据,FragmentManager管理Fragment时saveState报错. 解决方法 由于保存的数据较多,无法确定那个数据比较大,最后使用这个库_toolargetool_定位到数据较大的对象. 将_toolargetool_引入到项目 在Application中初始 这个库会在每次关闭Activity,Fragment时,打印出onSaveInstanceState的对象及大小.如图 查找log中较大的对象,进行相应的处理即可.比如保存到数据库,缩小对象等 相关链接 https://github.com/guardian/toolargetool

Typecho-Android客户端开发

协议 XML-RPC_wp协议:https://codex.wordpress.org/XML-RPC_wp 地址:http://xxxx.com/xmlrpc Typecho XML-RPC协议:https://github.com/typecho/typecho/blob/master/var/Widget/XmlRpc.php#L2249-L2322 Demo XML-RPC_wp协议Demo:https://github.com/xfans/android-xmlrpc1 Typecho XML-RPC返回数据:IXR/Value.php