AsyncTask
콘텐츠 공급자를 쿼리하고 해당 작업의 onPostExecute()
에서 몇 가지 추가 처리를 수행하고 있습니다. 재현하기가 매우 어려운 예외에 대한 스택 추적이 있지만 조건을 방지하거나 코드를 수정하고 싶습니다. 코드는 다음과 같습니다.이 ArrayIndexOutOfBounds 예외가 throw되는 방법에 대해 잘 모르겠습니다.
int i = 0;
mIds = new long[cursor.getCount()];
while (cursor.moveToNext()) {
mIds[i++] = cursor.getLong(COLUMN_ID);
}
루프의 회선에서 충돌이 발생했습니다.
cursor.getCount()
잘못된 수를 반환 : 만약 내가 볼때,이 일어날 수있는 유일한 방법입니다.cursor
이 루프가 실행되는 동안 변경되지만 이라고 생각할 수 없습니다.cursor
은 로컬 변수이기 때문입니다. 아마도cursor
의 기본 요소가 변경된 것으로 알고 있습니다.mIds
이 변경되었습니다. UI 스레드에서 을 실행하고 있기 때문에 가능하지 않습니다.이 변수에 새 값인 이 할당 된 유일한 곳입니다. UI 스레드에서 실행되는onPostExecute
의 특성상이 코드가 다른 시간에 동시에 실행되는 것은 불가능합니다. 맞습니까?
내가 누락 된 항목이 있습니까? 전체 코드를 보지 않고 그 루프에 어떤 문제가 있는지 확인
int i = 0;
mIds = new long[cursor.getCount()];
while (cursor.moveToNext()) {
mIds[i] = cursor.getLong(COLUMN_ID);
i++;
}
그냥 루프 전에 mIds''의 길이를 로그 :
여기 내 접근 방식에 대한 백업입니다. 그런 다음 mIds [i ++]에 대입 할 때 조건부 중단을하고 'i> = mIds.length'이면 중단됩니다. 그것이 깨지면'커서'가 길이를 바꿨 던지 아니면 다른 일이 벌어 질 지에 관계없이'mIds'가 어떻게 든 다시 할당되었는지 확인할 수 있습니다. –
현재이 정보를 기록하지 않고 재현 할 수 없으므로 (하나의 버그 보고서가 있음) 코드를 추가하여 조건을 보호 할 수 있기를 바랍니다. –