MapView で OutOfMemory

586 views
Skip to first unread message

ちょこ

unread,
Sep 4, 2011, 4:05:38 AM9/4/11
to 日本Androidの会
いつもお世話になっております。
昨日よりずっと悩み続けても答えが出ません。ヒントだけでも頂ければ幸いです。

症状ですが、MAPをずっとスクロールさせ続けるとMAPが表示されなくなり方眼紙にようになり
それでもMapViewを触り続けると強制終了が発生します。
ただし、必ず発生ずる物ではなく何かタイミング的な物が有るのでしょうか、
出ない時は、しつっこく20分とかスクロールし続けても発生しません

LogCatの内容

Couldn't get connection factory client
 検索して得た情報にようるとMapKeyが間違っているとか?
 再度、debug.keystoreからキーを作成しましたが変化は有りません

Window already focused, ignoring focus gain of:
com.android.internal.view.IInputMethodClient$Stub$Proxy@304e7bf8
 マップの動きが遅くなったりした時に出ます。

更に触り続けると、以下のような警告とエラーが出ます。
順番は入れ替わり複数回出力される事もあり、他にもメッせージは出ますが抜粋しました。

Scheduling restart of crashed service com.google.android.apps.maps/
com.google.android.location.internal.services.NetworkLocationService
in 5000ms

Recycling dispatcher
com.google.googlenav.datarequest.DataRequestDispatcher@2fde75b0

Java.lang.IllegalStateException: Connection pool shut down.
at
org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:
284)
:
:

Activity com.text.MyApp.MyApp has leaked IntentReceiver
com.google.android.maps.NetworkConnectivityListener
$ConnectivityBroadcastReceiver@2fdde328 that was originally registered
hear. Are you missing a call to unregisterReceiver()?

android.app.IntentReceiverLeaked: Activity com.test.MyApp.MyApp has
leaked IntentReceiver
com.google.android.maps.NetworkConnectivityListener
$ConnectivityBroadcastReceiver@2fdde328 that was originally registered
hear. Are you missing a call to unregiste

最終的にはOutOfMemoryで強制終了します。

OutOfMemory
571644-byte external allocation too Iarge for this process.
VM won't let us allocate 571644 bytes

メモリーリークについては、こちらの過去ログを見て対策してみました。
いったい何が起こっているのでしょうか
何かお気づきの事等ありましたら、よろしくお願いします。

ちょこ

unread,
Sep 4, 2011, 2:50:18 PM9/4/11
to android-g...@googlegroups.com
自己Resです。若干理解しました。
無関係と思って書いていませんでしたがメインActivityとサブActivityの両方でMapViewを使っています。
このような場合はProcessを分けないと正常に表示されないと言う物を過去ログで見つけました。
こちらではOutOfMemoryしない限り正常に表示されていたので気づきませんでした。

これを修正したらどうなるかですが、シングルプロセスで書き上げてしまったアプリなので
サブの方が正常に動かなくなってしまいました。
この修正には時間を要しますので、修正後にどうなるかですね。
全部落ち着いてくれたら嬉しいのですが、まだ他にも何か有るのかもしれません

そうめい

unread,
Sep 5, 2011, 2:57:56 AM9/5/11
to 日本Androidの会
ちょこさん

もしかして、これ関係ないですか?
http://blog.livedoor.jp/android_asai24/archives/2010-01.html


私も1アプリ内で複数MapViewを使っていたときによく落ちてしまっていて
調べたら上記ページが見つかったので
1つのMapView(Activity)を使い回すことで解決しました。

ただ、私の場合はMapViewを含むActivityを遷移しているときに発生していたので
もしかしたら違う現象かもしれませんが。

ちょこ

unread,
Sep 5, 2011, 9:04:57 AM9/5/11
to android-g...@googlegroups.com
そうめいさん

情報をありがとうございました。言われる通り、それのようですね!
しかしProcessを分ける事でも回避出来るようです。

DDMSと、今回初めて知ったMemoryAnalyzerを使ってヒープの追跡を勉強中です。

ありがとうございました。

ちょこ

unread,
Sep 6, 2011, 12:30:28 AM9/6/11
to android-g...@googlegroups.com
独りで大騒ぎして失礼しました。

SQLiteを使ったclassが完全にstaticな奴だったので時間を要しましたが
Processを分離する事で綺麗に収まり、OutOfMemoryも出なくなりました。

余談ですが、力でねじ伏せようとしたら・・

public class MyTracks extends MapActivity {
   private MapView map=null;

   @Override
   protected void onResume() {
      super.onResume();

map = new MapView(this,getResources().getString(R.string.map_key));

LinearLayout layout = (LinearLayout)findViewById(R.id.MainMapLayout); layout.addView(map);
}

@Override
protected void onPause() {
super.onPause();
map=null;
}

mapをfinalにしろと怒られました。(残念

そうめいさんにご教授頂いた方法
MyMapView等のクラスを作り、その中でMapViewを生成
それを使いまわすと言うのも有りだと思いますが
既にプロセスの分離に走っていたので、そちらの方法にしました。

おかげでDDMSとMemoryAnalyzerの使い方に強くなりました。

ありがとうございました。

Reply all
Reply to author
Forward
0 new messages