今天遇到一个问题想做个记录,首先描述一下问题吧!
问题是这样的:A用户要添加B用户为好友,当A把请求发到B之后,B这边弹出接受好友dialog,之后 点击接受,A的用户列表正确显示B的ID和状态,但是B这边没有A用户的状 态不明。之后,我试了一下A和B能不能聊起来,结果A向B发消息没有问题,但是B往A发消息A却收不到,没有任何错误提示。
查找这个bug的原因:
1.是不是请求之后xmpp连接断掉了?
2.是不是A没有及时更新自己的在线状态?
就照着上面两个思路查了大半天,结果徒劳,上午干什么都没劲,找不到问题的原因,xmpp进行二次开发,涉及到的东西还挺多,所以一旦遇到问题,都得缕出一个思路,要不然像个无头苍蝇是没办法解决bug的。
下午自己做了面条吃了,吃的不爽,没胃口。最后做了几个实验,首先得抓到B点击完接受之后给A发的数据能监听到吧,所以就照着这个思路在监听的位置打了个断点,结果是可喜的至少自己的假设是正确的,然后就是单步跟踪了,结果跟到取sharePreference的时候我恍然大悟了,原来我没有实现这个功能啊,结果还真是取出的结果集是NULL,于是把这块的结果集我先 写成固定的。编译后继续跟踪这块,再往下走,就不对了,我看我的Roster.getDefaultSubscriptionMode()是manul呀,这怎么回事?条件怎么是SubscriptionMode.accept_all,走另一个分支的话可是我没实现啊,蛋疼!所以猜想那一块是不是把响应模式设定好了,所以我搜索了一下manul,恩 ,没错,又一次猜想正确,开始初始化连接的时候讲邀请好像响应模式改为了Roster.SubscriptionMode.manual,所以你懂得。在此其实可以得出一个小结论了,不设置的话默认就是accept all。所以改了之后再跟踪结果就正确了,成功将Presence subscription = new Presence(Presence.Type.subscribe);发出去了,B好友列表中A的状态显示在线,那当然了,A和B也能正常聊天了,好了,明天完善,今天就到这。