MIDP 1.0/2.0 應用程式面臨 CPU 弱、記憶體少 (幾十 KB~幾百 KB)、螢幕小、JAR 大小限制等挑戰。本文闡述核心設計模式:自動適應裝置配置、避免 OOM、減少圖片縮減 JAR 體積。
分配大記憶體前 (如下載圖片、建立大陣列) 必須預檢可用記憶體:
// 範例:下載圖片前預檢
System.gc(); // 建議先觸發 GC
int maxSize = 102400; // 100KB 目標分配
int freeMem = (int) Runtime.getRuntime().freeMemory();
if (maxSize > freeMem * 2 / 3) {
// 記憶體不足,顯示 Alert 提示使用者,不嘗試分配
// Alert alert = new Alert("錯誤", "記憶體不足,無法完成操作", null, AlertType.ERROR);
// display.setCurrent(alert);
} else {
byte[] buffer = new byte[maxSize];
// 進行網路下載...
}
關鍵點:freeMemory() * 2/3 留有安全邊際,防止分配瞬間 GC 尚未完成導致實際可用不足。
策略:程式碼彈性化,圖片可選載入。低配裝置只需移除圖片檔重打包,程式碼零修改。
Image logo = null;
try {
logo = Image.createImage("/logo.png");
} catch (Exception e) {}
if (logo == null) {
// 降級以文字顯示
g.setColor(0);
g.drawString("MyApp", getWidth()/2, getHeight()/2, Graphics.HCENTER | Graphics.BASELINE);
} else {
g.drawImage(logo, getWidth()/2, getHeight()/2, Graphics.HCENTER | Graphics.VCENTER);
}
Image icon = null;
try { icon = Image.createImage("/item_icon.png"); } catch (Exception e) {}
append("選項文字", icon); // icon 為 null 時僅顯示文字,功能完全正常
logo.png, item_icon.png 等非核心圖片,重新打包 → JAR 大幅縮小,程式碼無需變動,功能完整保留。