2008年2月25日月曜日

OverlayController使用時にConcurrentModificationException発生

MapView+OverlayControllerを使用時、頻繁に画面が更新されていると、ConcurrentModificationExceptionが発生する。

-------------------------------------------------------------------------
W/dalvikvm( 1770): threadid=3: thread exiting with uncaught exception (group=0x4
000fdf8)
E/AndroidRuntime( 1770): Uncaught handler: thread Main exiting due to uncaught e
xception
E/AndroidRuntime( 1770): java.util.ConcurrentModificationException
E/AndroidRuntime( 1770): at java.util.AbstractList$SimpleListIterator.nex
t(AbstractList.java:59)
E/AndroidRuntime( 1770): at com.google.android.maps.OverlayBundle.draw(Ov
erlayBundle.java:36)
E/AndroidRuntime( 1770): at com.google.android.maps.MapView.onDraw(MapVie
w.java:337)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4574)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4550)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4550)
E/AndroidRuntime( 1770): at android.widget.FrameLayout.draw(FrameLayout.j
ava:208)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4550)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4550)
E/AndroidRuntime( 1770): at android.widget.FrameLayout.draw(FrameLayout.j
ava:208)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4578)
E/AndroidRuntime( 1770): at android.widget.FrameLayout.draw(FrameLayout.j
ava:208)
E/AndroidRuntime( 1770): at android.view.ViewRoot.draw(ViewRoot.java:531)

E/AndroidRuntime( 1770): at android.view.ViewRoot.performTraversals(ViewR
oot.java:429)
E/AndroidRuntime( 1770): at android.view.ViewRoot.handleMessage(ViewRoot.
java:584)
E/AndroidRuntime( 1770): at android.os.Handler.dispatchMessage(Handler.ja
va:80)
E/AndroidRuntime( 1770): at android.os.Looper.loop(Looper.java:91)
E/AndroidRuntime( 1770): at android.app.ActivityThread.main(ActivityThrea
d.java:3052)
E/AndroidRuntime( 1770): at java.lang.reflect.Method.invokeNative(Native
Method)
E/AndroidRuntime( 1770): at java.lang.reflect.Method.invoke(Method.java:3
56)
E/AndroidRuntime( 1770): at android.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:1547)
E/AndroidRuntime( 1770): at android.os.ZygoteInit.main(ZygoteInit.java:14
45)
E/AndroidRuntime( 1770): at android.dalvik.NativeStart.main(Native Method
)
-------------------------------------------------------------------------


原因はどうやらAPIの使い方が悪かったことらしい。
画面更新中に、OverlayController#add()/clear()を実行してはいけないようだ。

正しい使い方としては、使用するOverlayオブジェクトは初期化時にadd()しておき、その後はadd()/clear()ではなく、activate()/deactivate()を使用して、Overlayのon/offを行うべきだと思われる。

2008年2月22日金曜日

エミュレータの画面が表示されない

ecllipse+DoJa-5.0開発キットで作成したアプリを実行したところ、エミュレータは起動するが画面が表示されなかった。
また、eclipseを使わず開発キットのみで実行しようとすると「MSVCR71.dllが無いため起動できない」と言われた。

MSVCR71.dllを適当なサイトからダウンロードして、C:\WINDOWS\system32に配置することで、改善された。

2008年2月21日木曜日

緯度経度から情報検索

GPSから取得した緯度経度から、その地点周辺の情報を検索したい。

しかし現状のSDK(ver. m5-rc14)では実現できない。
※android.location.Geocoder#getFromLocation(double latitude, double longitude)
というAPIは存在する。しかし、現状エミュレータ上でこのAPIを使用しても、エミュレータ内のデータベース(/data/misc/location/geodb)を検索するだけらしく、使い物にならない模様。


したがって、使えるWebAPI探して利用するしかない。
候補としては、GeoNames(http://www.geonames.org/)が有力。
このサイトのWebAPIであるfindNearbyWikipediaを使用すれば、緯度経度からその周辺に存在するもののWikipediaエントリー情報を取得できる。
(http://www.geonames.org/export/wikipedia-webservice.html#findNearbyWikipedia)