这怎么可能?
在后台线程上,我运行一些计算来填充一个列表,然后使一个视图无效,然后视图运行ondraw。
var list = mutableListOf<Pair<DataPoint, String>>()
...
generateBgData() {
list.clear()
list.add(...,...)
invalidate()
}
在ondraw中,我复制了一个列表,以防止列表的更新导致错误,
val listCopy = ArrayList(list)
for ((point, str)in listCopy) { // Null exception thrown here
canvas.drawText(...)
}
但我注意到,在分解结构时,出现了一个空对象引用错误 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object kotlin.Pair.component1()' on a null object reference
. 这怎么可能?我的列表是非空的,我从来没有把列表设置为空。如果为空,则for循环不应运行。我在这里重新创建了运行该问题的代码,并且无法复制它,但是在我的play store应用程序中很少发生这种情况。
知道会发生什么吗?
1条答案
按热度按时间vuktfyat1#
多线程可能是罪魁祸首。假设在运行此代码时,列表中有一些项:
当arraylist构造函数从列表中复制项时,另一个线程清除列表,这会将所有内容标记为null。如果另一个线程清除列表的速度比这个线程复制引用的速度快,那么它将开始复制列表中最后一个项目的空引用。
如果要修改来自多个线程的数据,我建议只使用只读列表。