不出错的代码就是好代码,但也可能是让人困惑的代码

这是腾讯TIM异步加载记录造成冲突的一段日志

早几年,曾经使用过腾讯开放接口。
主要就是:注册腾讯云账号--开头TIM和腾讯音视频---开发音视频直播对讲应用

问题


    加载聊天记录时几率性的页面崩溃。在debug--console中看到如下错误,一直不明所以。
    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder
    问题提示集中在MessageListAdapter无法获取ViewHolder,位置错误。关联位置MessageLayout。
    排查跟踪,发现问题似乎发生在notifyItemRangeInserted之后。以为是RecycleView的操作代码有问题,更改了之后发现不对。
    知道问题的位置,但不知道为什么错误。
    于是自己搜索了一下,根据别人的分析,很快发现了问题。
    
    原来对数据源list的操作和对notify操作并没有按顺序进行导致的。

    如果了两次异步添加记录时间过短,并且两次notifyItemRangeInserted的顺序交叉进行,最终导致RecycleView更新错误出现错误。
    flag = mDataSource.addAll(0, list);
    mAdapter.notifyDataSourceChanged(DATA_CHANGE_TYPE_ADD_FRONT, data);
    notifyItemRangeInserted(0, value);

问题的原因


    在程序中调用布局页面ChatLayout,进行初始化,ChatLayout会自动加载一部分聊天记录。而这个时候,程序查询我们自己后台的业务咨询详情,获取之后重新进行查询聊天记录的操作。
    
问题呈现几率性的原因
    服务器消息响应缓慢,可以导致再次查询更多聊天记录的时间点推迟,这样两次设置聊天界面聊天记录的时间间隔加大,造成了顺序加载数据的假象,从而掩盖的了问题。
    但是如果消息响应速度加快,有一定几率导致异步调用出现,造成崩溃。

问题总结


    加载tim历史消息的时候,遇到一个同步问题,因为tim会加载几天的记录,自己的应用有需要加载更久的记录,造成了冲突。
    这是一个异步调用冲突的问题。

体会


    一些无关痒痛的代码也会导致调用时间延迟,从而造成效率低下的代码(对线程同步造成影响),竟然不会出现问题。
    

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值