0

したがってGlobal、すべてのファイルからアクセスできるあらゆる種類のデータを保持することになっているクラスがあります。Globalこのように見えます:

public class Global{
public static int rules = 0;
public static String data;
public static int score;
public static int speed = 0;
//etc...
}

やることGlobal.x = ___などで設定して手に入れます。

ただし、最近、プロジェクトのメモリリークをクリーンアップしました。このプロジェクトでは、View A作成したビュー()が想定よりも長く存続していました。

これView Aは割り当てられましGlobal.xた。

さて、に移動するとView BView AGCされます。

ただし、Global.x値はなくなりました。

これはJavaから期待される動作ですか?もしそうなら、どうすればグローバルクラスに変数を割り当てて、死んView Aだ後もそれが保持されることを保証できますか?View A

それとも私はどこかで何か間違ったことをしているだけですか?

何かを見落としている場合に備えて聞いてみようと思いましたが、おそらく後者でしょう。

4

2 に答える 2

3

あなたが述べたように、問題はあなたがあなたの特定の問題を解決するのを助けるであろう事実を欠いています。問題を再現する、作成できる最小のJavaコードを貼り付けることを検討してください。そうは言っても、あなたのデザインは悪いので、シングルトンの使用を検討する必要があります。

public class Global { 

    private Global INSTANCE = new Global();
    private int speed;

    private Global() { 
        // whatever you do to initialize...
        speed = 65;
    }

    public Global getInstance() { 
    }

    public int getSpeed() { 
        return speed;
    }

    public void setSpeed(int speed) { 
        this.speed = speed;
    }
}

そして、あなたがどんな範囲にいても、あなたは言うことができます:

Global.getInstance().getSpeed();

また

Global.getInstance().setSpeed(25);

等...

于 2013-02-19T04:59:29.220 に答える
2

デザインの問題はさておき。

のガベージコレクションが;View Aの値に影響を与えると私が考えることができる方法は、実際には2つだけです。Global.x

  • Global.xWeakReferenceView Aまたはそれと一緒にガベージコレクションされるものです(または使用します) 。
  • View Aの値を変更するファイナライザーがありますGlobal.x

これらのどちらも聞こえない可能性があります(もちろん、私はあなたのコードを見ることができませんが)

私の最善の策は、他の場所でエラーを探す必要があることです。グローバル状態変数は本質的にスレッドセーフではないため、問題はスレッドに関連している可能性があります。

于 2013-02-19T05:01:14.073 に答える