【发布时间】:2011-11-15 04:59:47
【问题描述】:
我有一个AsyncTask 查询内容提供者并在该任务的onPostExecute() 中进行一些额外的处理。我有一个很难重现的异常的堆栈跟踪,但我想防范这种情况或修复代码。代码如下:
int i = 0;
mIds = new long[cursor.getCount()];
while (cursor.moveToNext()) {
mIds[i++] = cursor.getLong(COLUMN_ID);
}
崩溃发生在循环中的行上。在我看来,这可能发生的唯一方式 是如果:
-
cursor.getCount()返回的计数不正确。 -
cursor在此循环执行时被更改,但我认为这是不可能的 因为cursor是一个局部变量。也许cursor背后的某些东西发生了我不知道的变化。 -
mIds已更改。这不应该是可能的,因为我们正在运行 在 UI 线程上,这是唯一分配该变量的地方 一个新的价值。由于onPostExecute在 UI 线程上运行的性质,这段代码不可能同时在其他地方运行,对吧?
我错过了什么吗?
【问题讨论】:
-
在循环之前记录
mIds的长度。然后在对 mIds[i++] 的赋值处放置一个条件中断,如果i >= mIds.length则中断。当它中断时,您可以检查mIds是否以某种方式重新分配,cursor是否更改了长度,或者可能发生的其他情况。 -
我目前没有记录此信息并且无法重现(收到一份错误报告),所以我希望我可以添加代码来防范这种情况。