2012-10-15 61 views
4

我正在爲觸摸設備使用自定義文本字段,並且此文本字段將用於遊戲。這個自定義文本字段是一個類,並有一個變量,其中存儲的鍵盤圖像是靜態變量,如果我必須在一個頁面(屏幕)中顯示2個文本字段,我將不得不創建2個文本字段類的對象並且由於鍵盤圖像存儲在一個靜態變量中,它將被兩個對象共享,現在我想知道,如果有任何對象是由自定義鍵盤類創建的,這些對象(內存)是否被任何變量引用,if不是我想要釋放圖像內存並在創建新對象時重新加載它。如何查找j2me中是否有任何類(內存)的對象被引用或不在?

回答

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; 
    } 
} 

這使得只要沒有引用它的實例,鍵盤圖像就有資格進行垃圾回收,否則它會一直存在並在實例之間共享。

+0

謝謝弗蘭克,但只有一個問題,在J2ME沒有訪問WeakRefrence,但我可以使用上述代碼在我的其他Java項目,所以再次感謝 –

+2

它取決於J2ME配置文件,cf 。我的WeakReference鏈接位於J2ME javadoc中,而不是J2SE。你可能沒有在你正在使用的配置文件(因此我的「如果」),但也有一些。 –

+0

嗨弗蘭克,以及我發現了WeakReference是在我使用的配置文件,我有一個疑問,如果我保持(鍵盤)變量作爲非決賽,將結果是相同的。因爲我在編譯時在這一行發現錯誤(this.keypad = keypad;)說「最終的現場鍵盤不能被分配」。 –

1

IMO爲Java ME應用程式,你應該有代碼庫的足夠了解才知道自己當圖像等消耗內存對象可以被釋放。

+0

感謝回答,你看到這個類會被其他程序使用,我可以提供當程序員也需要一個釋放資源的函數時,我會依賴程序員來釋放資源。 –

相關問題