MapViewを使用しています。オーバーレイアイテムを追加する必要があります。オーバレイアイテムを追加するのが遅く、ドラッグされたときにマップがANRになることがわかりました。そこで、オーバーレイアイテムを追加するAsyncTaskを作成しました。最初は、バックグラウンドスレッドからオーバーレイコレクションにアクセスしていたので、一貫して失敗していたことがわかりました。スレッドセーフではありません。そこで、オーバーレイはUIスレッドからのみ変更されるように変更しました。今は機能しますが、たいていの場合に限ります。マップがタッチされたときに非常に時々クラッシュします。ここでArrayIndexOutOfBoundsExceptionを発生させずにAsyncTaskからMapViewオーバーレイアイテムを更新する方法
はAsyncTask(のMapViewの私のサブクラス内の内部クラス)です:
class showItemsTask extends AsyncTask<Void, User, Void> {
public boolean stop = false;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
protected Void doInBackground(Void... v) {
User[] items = Item.getItemList();
if (items != null && items.length > 0) {
int i = 0;
for (User item : items) {
publishProgress(item);
i++;
if (stop || i>MAX_NUMBER_OF_ITEMS) break;
}
stop = false;
}
return null;
}
@Override
protected void onProgressUpdate(User... itemContainer) {
super.onProgressUpdate(itemContainer);
User item = itemContainer[0];
showItem(item.location.latitude, item.location.longitude, item.location.firstname, ((Integer) item.location.id).toString());
}
public void showItem(float latitude, float longitude, String itemTitle, String itemSubtitle) {
try {
GeoPoint point = new GeoPoint((int) (latitude * 1000000), (int) (longitude * 1000000));
OverlayItem marker = new OverlayItem(point, itemTitle, itemSubtitle);
availableItemsOverlay.addOverlay(marker);
} catch (Exception e) {
Trace.e(TAG, "Exception drawing a item");
}
}
protected void onPostExecute(Void v) {
invalidate();
}
}
ここでスタックトレースです:
0 java.lang.ArrayIndexOutOfBoundsException
1 at com.google.android.maps.ItemizedOverlay.maskHelper(ItemizedOverlay.java:562)
2 at com.google.android.maps.ItemizedOverlay.setFocus(ItemizedOverlay.java:365)
3 at com.google.android.maps.ItemizedOverlay.focus(ItemizedOverlay.java:539)
4 at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:455)
5 at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)
は私がAsyncTaskと間違った道を下って行くだろうか?そうでない場合は、UIスレッドでオーバーレイのすべての変更が行われているときに、なぜこの例外が発生するのかわかりますか?
mapViewが無効化されていない正確な理由を知りましたか? 私は同様の問題を抱えています:http://stackoverflow.com/questions/23011264/mapview-doesnt-invalidate-onprogressupdated-of-async-task – zIronManBox