这是腾讯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会加载几天的记录,自己的应用有需要加载更久的记录,造成了冲突。
这是一个异步调用冲突的问题。
体会
一些无关痒痛的代码也会导致调用时间延迟,从而造成效率低下的代码(对线程同步造成影响),竟然不会出现问题。