AsyncTask
私はコンテンツプロバイダにクエリを行い、そのタスクのonPostExecute()
でいくつかの追加処理を行います。再現するのが非常に難しい例外のスタックトレースがありますが、条件を守り、コードを修正したいと思います。コードは次のとおりです。このArrayIndexOutOfBounds例外がどのようにスローされているかわかりません
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
の性質上、このコードは他の場所で同時に実行することはできません。
何か不足していますか?
ちょうどループの前に 'mIds'の長さを記録します:
ここに私のアプローチのためのバックアップです。次に、mIds [i ++]への代入に条件付きブレークを置き、 'i> = mIds.length'ならブレークします。それが壊れたときに、 'カーソル'が長さを変更したのか、他に何が起こっているのか、 'mIds'がどうにか再割り当てされたかどうかを確認することができます。 –
私はこの情報を現在ログに記録せず、再現できませんでした(バグレポートが1つあります)ので、条件を守るためのコードを追加することができます。 –