-2

アプリにランタイムデータを保存するために、2つの静的変数を持つクラスがあります。

public class App {
  public static ClementineConnection mClementineConnection = null;
  public static Clementine mClementine = null;
}

それらはonCreate最初のアクティビティのメソッドで初期化されます。このアクティビティは、状態(アプリがサーバーに接続されている)に応じて他のアクティビティを開始するだけです。

アプリがアイドル状態であるか、通知を使用してバックグラウンドで実行されている場合、静的変数の1つにアクセスすると、他のonCreateメソッドでNullPointerExceptionが発生することがあります。どういうわけか彼らはガベージコレクションを取得します。アプリにはバックグラウンドで実行されているスレッドを持つサービスがあるので、常に参照が必要だと思いました。

これらの静的変数がガベージコレクションされるのを防ぐ方法を知っていますか?アプリがサーバーに接続されている間、情報が利用可能である必要があります。新しいインスタンス(例Clementine.getInstance())を作成することはオプションではありません。

コードを確認したい場合:https ://code.google.com/p/clementine-remote-android/source/browse/

4

3 に答える 3

0

私があなたがする必要があると思うのは、Androidアプリケーションクラスを使用することです。

そこで、すべてのアクティビティに対してデータを共有および永続化し、そこで変数を初期化できます。アプリクラスに拡張させることができます。

public class App extends Application {
    public static ClementineConnection mClementineConnection = null;
    public static Clementine mClementine = null;

そして、それぞれの活動において:

App app = ((App)this.getApplication());

また、マニフェストで宣言する必要があります。

<application android:name="de.qspool.clementineremote.App" ...></application>

主題に関するそれらの答えを見てください:

于 2013-02-07T11:30:28.743 に答える
0

静的変数を使用してアプリのライフサイクル状態を保存することは信頼できません。サービスを使用している場合でも、メモリが不足している場合はいつでもアプリを強制終了できます。最新のAndroidバージョンでは、ユーザーが開いているアプリのリストでアプリをスライドさせると、強制終了されます。

アプリが強制終了されると、Linuxプロセスが強制終了されます。つまり、すべてのアクティビティ、サービスが強制終了されます。もちろん、これは静的変数が失われることを意味します。

私はこの種のことで多くのことを戦い、アプリの状態を常に維持するための信頼できる良い方法は、静的変数の代わりにSharedPreferencesを使用してアプリの状態変数を格納することであることがわかりました。

于 2013-02-07T12:21:34.323 に答える
-2

アプリケーションクラスを常に拡張して、静的データをアプリケーションに保存する必要があります。

public class App extends Application {
    public static ClementineConnection mClementineConnection;
    public static Clementine mClementine;
}

アプリケーションが開始されると自動的にインスタンス化されるので、次のように最初のアクティビティのoncreateの変数に保存するだけです-

App.mClementineConnection = data;

そしてIt wont make any null pointer exception till your application is closed

ありがとう、私の友人を楽しんでください。

于 2013-02-07T12:18:34.677 に答える