2012-01-05 13 views
3

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スレッドでオーバーレイのすべての変更が行われているときに、なぜこの例外が発生するのかわかりますか?

+0

mapViewが無効化されていない正確な理由を知りましたか? 私は同様の問題を抱えています:http://stackoverflow.com/questions/23011264/mapview-doesnt-invalidate-onprogressupdated-of-async-task – zIronManBox

答えて

0

オーバーレイを更新した後(availableItemsOverlay.addOverlay(marker)以降)マップビューのpostInvaliadate()を呼び出す必要があると思います。

0

onProgressUpdate()runs on the UI threadオーバーレイアイテムを追加するために使用するかどうかはわかりませんが、代わりに、onPostExecute()にオーバーレイを追加することをおすすめします。 add()操作は、この時点でアイテムのリストがすでに生成されているため、高価ではありません。

@Override 
protected void onPostExecute(List<OverlayItem> overlay) { 
    mMapView.getOverlays().add(overlay); 
    mMapView.invalidate(); 
} 

あなたは方法を一致させるために、あなたAsyncTask<Void, User, List<OverlayItem>>からAsyncTaskの署名を変更する必要があります。

+0

次も見ることができます:http://stackoverflow.com/questions/23011264/mapview-doesnt-invalidate-onprogressupdated-async-task 私は似た問題を抱えています – zIronManBox

関連する問題