4

タッチデバイスのカスタムテキストフィールドに取り組んでいます。このテキストフィールドはゲームで使用されます。このカスタムテキストフィールドはクラスであり、静的変数であるキーパッドイメージが格納される変数があります。1ページ(画面)に2つのテキストフィールドを表示する必要がある場合は、テキストフィールドクラスの2つのオブジェクトを作成する必要があります。キーパッドイメージは静的変数に格納されるため、両方のオブジェクトで共有されます。カスタムキーパッドクラスのオブジェクトが作成されている場合、これらのオブジェクト(メモリ)は任意の変数によって参照されているかどうかを知りたいです。イメージメモリを解放して、新しいオブジェクトが作成されたときにリロードしたいのではありません。

4

2 に答える 2

2

にアクセスできる場合は、クラス内の画像WeakReferenceに対して静的な状態を維持しWeakReference、クラスのインスタンスで非静的な(強力な)参照を持つことができます。

public class CustomTextField {
    // Only necessary if multiple threads can create UI elements
    private static final Object lock = new Object();
    private static WeakReference<Image> keypadRef;

    private final Image keypad;

    public CustomTextField() {
        this.keypad = loadKeypad();
    }

    private static Image loadKeypad() {
        Image keypad = null;
        // Same comment as above: you don't need the lock if the UI elements are
        // not created in multiple threads.
        synchronized (lock) {
            if (keypadRef != null) {
                keypad = keypadRef.get();
            }
            // Either there was no existing reference, or it referenced a GCed
            // object.
            if (keypad == null) {
                keypad = new Image();
                keypadRef = new WeakReference(keypad);
            }
        }
        return keypad;
    }
}

これにより、キーパッドイメージを参照するインスタンスがなくなるとすぐに、キーパッドイメージがガベージコレクションの対象になります。それ以外の場合は、キーパッドイメージが保持され、インスタンス間で共有されます。

于 2012-10-15T08:50:51.107 に答える
1

Java MEアプリのIMOは、画像などのメモリを大量に消費するオブジェクトをいつ解放できるかを自分で知るために、コードベースを十分に理解している必要があります。

于 2012-10-15T11:16:11.627 に答える