2011-08-01 7 views
0

以下に示すように、アプリケーション内にいくつかのグローバル変数を定義して、アプリケーションを拡張しました。私は、アプリを離れると、より多くのアプリを開き、それらを少し再生し、私のアプリに戻って、グローバル変数が削除され、私のアプリケーションがクラッシュします。 2つの質問があります:グローバル変数の問題

1-これはどのように可能ですか?

2バックグラウンドに行くときにアプリを強制終了するにはどうすればよいですか?私は

おかげ

public class GlobalVars extends Application { 

    public static HashMap<Integer, String> ID2Cat = new HashMap<Integer, String>(); 

    // User logged bool 
    public static boolean isLogged = false; 

    // Current menu item 
    public static int currentMenuItem = 0; 
    public static boolean isHome = false; 

    // Goodideas  
    public static JSONObject goodIdeas = new JSONObject(); 

    // Meteo 
    public static JSONArray weatherItems = new JSONArray(); 

    // More stuff 

} 

...私はそれを行うことになっていないんだけど、私は他の解決策を見つけることができません知っているLogcat

は、ここに私は私のアプリが殺されていると思わせるものです。これは他のアプリで遊んでいるときに表示されます。

I/ActivityManager(2465): Process com.mysite.myapp (pid 23538) has died. 
I/WindowManager(2465): WIN DEATH: Window{4852a678 com.mysite.myapp/com.mysite.myapp.Home paused=false} 
I/WindowManager(2465): WIN DEATH: Window{485b63a8 com.mysite.myapp/com.mysite.myapp.Home paused=false} 
I/WindowManager(2465): WIN DEATH: Window{4826fbf8 com.mysite.myapp/com.mysite.myapp.ItemList paused=false} 
I/WindowManager(2465): WIN DEATH: Window{48286f90 com.mysite.myapp/com.mysite.myapp.ItemDetail paused=false} 
W/GpsLocationProvider(2465): Unneeded remove listener for uid 1000 
D/GpsLocationProvider(2465): stopNavigating 
D/gps_BRCM(2465): [status check] on_stop() : GPS_STATUS_SESSION_END 
D/gps_BRCM(2465): gps_engine_status_update 2 
D/GpsLocationProvider(2465): send an intent to notify that the GPS has been enabled or disabled 
D/gps_BRCM(2465): gps_stop: called 
V/GpsLocationProvider(2465): hybridGpsSensorDeregister : No registered sensorManager 
D/GpsLocationProvider(2465): hybridGpsSensorDeregister 

答えて

1

1 - これはどのように可能にすることができますか?

あなたのプロセスは、任意の時点で終了することができます。静的データメンバーまたはカスタムApplicationオブジェクトがどれくらい長く存続するかは想定できません。最高でも、キャッシュとしてのみ使用する必要があります。

2バックグラウンドに行くときにアプリを強制終了するにはどうすればよいですか?

あなたはありません。

は私が

それだけでそれを行うことになっていないよ知っているが、それはこの場合には、あなたを助けにはなりません。それができるのは、あなたが実際に正しく初期化するのを苦労していないので、100%時間がぶつかることです。

が、私は他の解決策を見つけることができません。

は、あなたのデータを初期化します。新しいカスタムApplicationインスタンスが作成されたためにアプリケーションがクラッシュする場合、Applicationサブクラスにはバグがあります。このバグは修正する必要があります。

+0

「データを初期化する」とはどういう意味ですか?アプリを起動すると、すべてのグローバル変数が初期化されるスプラッシュ画面が表示されます。アプリが死んだとき(つまり、すべてのアクティビティが終了したとき)にのみ削除されるデータを持つ方法はありませんか? – jul

+0

@jul: "アプリを起動すると、すべてのグローバル変数が初期化されているスプラッシュ画面が表示されます。"それは賢明な動きではありません。 「アプリが死んだとき(つまり、すべてのアクティビティが終了したときにのみ)削除されるデータを持つ方法はありませんか?」 - それはすでに起こっていることです。しかし、OSが決定すると、「すべてのアクティビティは終了しました。いつでも可能です。ユーザーがあなたのアプリを離れると、Androidはアクティビティを終了していつでもプロセスを終了できます。 – CommonsWare

+0

すべてのデータをスプラッシュ画面に読み込むのはなぜですか(アプリが起動されたとき)は賢明ではありませんか?私はそれらをWebサービスから取得し、HTTPリクエスト+ jsonを後で解析することで、アプリケーションのレスポンスが低下します。さらに、バックグラウンドで(例えば別のアプリケーションを使って)いるときに私のアプリを開くと、それは再び開始して、私のinitデータをロードするか、アクティビティが殺されていない場合はどこから離れるかを開始する必要があります。前者の場合、アクティビティがまだ生きている場合は、グローバル変数が削除されてはいけません。 – jul

1

あなたはデータを保存し、再起動時にそれを復元するために、適切なライフサイクルイベントハンドラを使用する必要があります。onSaveInstanceState()、onPause()、およびonResume()。グローバルフィールドがそのまま残っているとは間違いありません。

私はActivity life-cycleを自分でfamilizarizingお勧めします。

0

@Override onPauseあなたのアクティビティでは、次にfinish()を使用します。

0

Applicationクラスは、グローバル変数を初期化するためである - ので、あなたはこの部分が正しく持っています。しかし、Applicationは、アプリが新たに起動したときにのみ呼び出されるため、別のクラスでこれらの変数を宣言する必要があります。バックグラウンドではありません。

ApplicationonCreate()メソッド(@Overrideアノテーションを使用)でこれらの初期化も行う必要があります。

1

そのシンプルな、あなたがApplication.OnCreateであなた宣言された変数を初期化する必要があり、アプリケーションのクラッシュは、それが再びApplication.OnCreateを呼び出したとき、私はちょうどテストして、それが動作します。

私はそれが助けて欲しいです。

0

これは、キー段落と何あなたに起こっていることhttp://www.developerphil.com/dont-store-data-in-the-application-object/

を私は同様の問題に出くわしましたし、基本的には、この記事では、それを説明する:問題の核心に私たちをもたらします

:アプリケーションオブジェクトは永遠にメモリに残らず、殺されます。一般的な考え方とは異なり、アプリは最初から再開されません。 Androidは新しいApplicationオブジェクトを作成し、アプリケーションが最初に殺されたことがないという錯覚を与えるために、以前の場所でのアクティビティを開始します。

この投稿は古いですが、将来のユーザーには役立つと思います。

関連する問題