2013-10-09 7 views
5

こんにちは私たちはアンドロイドアプリケーションで奇妙な問題に直面しています。私たちのアプリでは、アプリケーションを起動するときに、最初のアクティビティとして、必要なすべてのオブジェクト/データを共通オブジェクト(オブジェクトAと呼ばれます)に格納しています。そのオブジェクトにコンテキスト自体を格納しました。私たちのアプリでコンテキストが必要なときは、オブジェクトAからコンテキストを取得して使用しています。以下の場合を除き、すべてのケースが正常に動作します。

i)私たちのアプリはバックグラウンドにありますが、ハイエンドのゲームをプレイしました。今度は、最小化された画面(最近のアプリ)でアプリに戻りました。突然アプリがクラッシュします。
ii)設定でアプリを強制停止し、最小化された画面でアプリに戻った場合、同じクラッシュが発生します。
オブジェクトがnullになる

どちらの場合も、オブジェクトAはnullになります(GCによって削除される可能性がある)ので、オブジェクトAに依存するすべての操作が例外を受け取ります。

どうしてですか? GCがオブジェクトAを収集しないようにするにはどうすればよいですか?どのように我々は力の停止に対処することができますか?アイデアを教えてください。

+0

GCやシステムが強制的にプロセスを強制終了することはできません。そのような場合には、オブジェクトをシリアライズ/デシリアライズする方法を見つける必要があります。 –

+0

これはおそらく、Androidアプリを書くときに理解しておくべき最も重要な概念です。 http://developer.android.com/training/basics/activity-lifecycle/index.html – Kuffs

+0

Android(実際にはDalvik)は、アプリが実行されていない限り、Androidへの参照がない限り、個々のオブジェクトをGCしません。私はこの神話がどこから始まったのか分かりません。あなたの** app **は殺されるかもしれません。その場合、すべてがゼロから始まります。状態を保存する必要がある場合は、 'onPause()'や 'onStop()'を使って直列化してください。 'onDestroy()'は、アクティビティを 'finish()'した場合にのみ便利です。ところで、あなたが格納している 'context'が' Activity'コンテキストであれば、あなたはそれをすべて間違っています。 – Simon

答えて

7

どうしてですか?

他のアプリも実行するにはメモリが必要です。 Androidがあなたのデータを無期限にメモリに保存すると仮定するのは無理です。

GCがオブジェクトAを収集しないようにするにはどうすればよいですか?

Do not。あなたの問題とは別の解決策を見つけてください。

私たちは強制停止にどのように対処できますか?アイデアを教えてください。最後に

、決定はあなた次第ですが、ここではいくつかの一般的なオプションがありません:保存されたデータがもう存在しない場合は

  • 、アプリの新鮮な打ち上げとして扱います。ユーザーをリンク先ページに誘導し、新しいゲームを開始させる。
  • データを保持します。あなたが保存しているものによっては、SharedPreferencesやSQLiteが良い選択肢かもしれません。ストレージオプションの概要については、Storage Optionsを参照してください。

2番目のオプションは明らかにコンテキストでは機能しませんが、おそらくコンテキスト用の別のソリューションを設計するでしょう。

2

あなたは、そのためのアプリケーションコンテキストを使用することをお勧めします。 ActivitygetApplicationContext()と入力し、代わりにこれを使用してください。 システムがメモリを必要とするとすぐにアクティビティがリークします。

あなたのアクティビティは、ビデオゲームまたはメモリ消費アプリを再生したときに家を押すと になると、システムによって解放されます。「正常な」Javaでそれを見たときにさらに活動のためのあなたのラップされたオブジェクトが、すぐにそれのためにそのeligableとしてGCによって収集されます

enter image description here

ことは、これを解決するための活動のライフサイクルを理解しようつまり、それは他のオブジェクトによって参照されていません。これは、システムがメモリを必要とするときにあなたのアプリケーション全体が解放されてしまうのを防ぐことはできません。 onResume()でnullをチェックして、オブジェクトを再度インスタンス化してみてください!

こちらがお役に立てば幸いです。

関連する問題