ページ 1 / 1
Activity再起動時にエラー
Posted: 2013年3月25日(月) 17:52
by とら
Androidアプリを作っている者です。
メニュー用Activityから
コード:
Intent intent = new Intent( this, GameActivity.class );
intent.setAction( Intent.ACTION_VIEW );
startActivity( intent );
でGameActivityを起動した後、finish();(または戻るボタン)でGameActivityを終わらせてから
再び上記のコードでGameActivityを呼び出すと、
Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
というエラーが出てきて、再びアプリを起動することができません。
他のActivityでも試したのですが、簡易な作りであるHowToActivityの方は何度起動しても落ちることがありません。
しかし、Activityの呼び出しや終わらせ方等はどちらも一緒であるため、なぜGameActivityの方だけエラーが出るのかが分かりません。
簡易な作りのHowToActivityがエラーが出ないため、メモリあたりが原因かなとは思っているのですが・・・
上記のエラーについて、出る原因などを知っている方はいらっしゃいますでしょうか。
また、Activityを終了する方法としてfinish();以外に有効な策(例えばメモリを開放してから終了するなど)はありますでしょうか。
どなたかご回答お願いいたします。
Re: Activity再起動時にエラー
Posted: 2013年3月25日(月) 23:09
by ISLe
どういうときにそのエラーが出るかは分かりませんが、finishを呼んだ後Activityのインスタンスが破棄されると思ってませんか?
GameActivity.classのインスタンスが既に存在すれば再利用されるので、例えばint型で初期値なしで宣言したインスタンス変数が0で初期化されていることを期待してコードが書かれている場合、前回終了時の値が残っていて正常に初期化が行われない等の問題が発生する可能性があります。
デフォルト値に依存するコードを書かないようにして、Activityのライフサイクルにそって初期化や後始末の処理が行われるようにしてください。
とら さんが書きました:また、Activityを終了する方法としてfinish();以外に有効な策(例えばメモリを開放してから終了するなど)はありますでしょうか。
Activityのインスタンスをプログラマが任意に破棄する方法はありませんので常に再利用を考慮してください。
Re: Activity再起動時にエラー
Posted: 2013年3月25日(月) 23:55
by とら
たしかに初期化等の考慮はしていませんでした!
というより、再起動して新しく呼び出されるたびにコンストラクタ内の処理をすると勘違いしていたので
そこに初期化の内容を詰め込んだのが原因っぽいです・・・
いろいろコードをいじってみます。回答ありがとうございます!
その勘違いに次いでもうひとつ疑問があるのですが、
メニュー用ActivityからゲームメインActivityを呼び出しfinish();でメニュー用Activityに帰る、という流れがあるとして、
メニュー用Activityで使うメモリを増やした(Bitmapをいくつか追加しました)後ゲームメインActivityを開こうとするとメモリリークが起こってしまったのですが、
ここでメニューからゲームへ移行する際にフラグを立て、メニュー用ActivityのonPause()内で「フラグが立っていればfinish();する」という方法を使えばメニュー用Activityのメモリを解放してゲームメインActivityが落ちることはなくなるのではないか、と考えたのですがこれは有効な方法なのでしょうか?
少しややこしくなってしまったのですが、要は
メニュー用Activityの使用メモリを増やす
→ゲームメインActivityがメモリリークで起動しなくなる
→メニュー用Activityのメモリはゲーム中では使わないのにGCされないのはなぜか
→それじゃあいっそのことゲームメインActivityを開いたらメニュー用Activityはfinish()しよう
という考えの元作成中なのですが、再利用をもとにして考えるとこれはやらないほうがいいですかね?
説明がややこしくなってしまい申し訳ありませんが、ご回答いただけるとありがたいです。
Re: Activity再起動時にエラー
Posted: 2013年3月26日(火) 01:30
by ISLe
メモリリークとはどういう症状のことですか?
Javaでは解放即回収とは限らないのでメモリリークはある意味常にあるものですが。
メモリが不足すると、Androidのシステムが停止状態のActivityを勝手に破棄します。
#逆にメモリが不足しない限りはプロセスすらも破棄されません。
再利用とは逆のパターンもあり得ますのでこちらも考慮してください。
アプリとしての状態遷移と各Activityのライフサイクルは無関係です。
Activityを連携するときは、IntentやBundleなどでアプリの状態を伝え、それによって遷移先が選択されなければいけません。
ゲームメインからメニューに『戻って』きたとしてもメニューActivityは元のインスタンスとは限りません。
新たに作成されたインスタンスに『戻って』くることがあるので必要に応じて以前の状態を復元する必要があります。
とら さんが書きました:という考えの元作成中なのですが、再利用をもとにして考えるとこれはやらないほうがいいですかね?
finishを呼んでもActivityインスタンスが破棄されるかどうかとは無関係です。
Activityが画面から消えるとonStopが呼ばれて停止状態になります。
onStartでビットマップを読み込み、onStopで削除すると良いでしょう。
ゲームメインActivityも同様にしないとメニューに戻ったときのメモリ使用量は同じになってしまいますので注意してください。
Re: Activity再起動時にエラー
Posted: 2013年3月27日(水) 20:27
by とら
メモリリークではなく、メモリ不足(OutOfMemory)の間違いでした。
勘違いすみません・・・
Bitmapを読み込み、解放する手順を加えたところ、若干ですが落ちる回数は減りました。
まだそこらへんに関しては勉強不足でもあるため、少し自分で調べてみようと思います。
ご回答ありがとうございました!