MIDP 設備常限制應用 ≤50KB,遠小於 J2SE 環境。本文以一個「輸入文本框變化播放聲音」的 MIDlet 為例,演示體積優化技巧。
package com.j2medeveloper.techtips;
import javax.microedition.lcdui.*;
public class BeforeSizeOptimization extends BasicMIDlet {
public static final Command exitCommand = new Command("Exit", Command.EXIT, 1);
public BeforeSizeOptimization() {}
protected void initMIDlet() { getDisplay().setCurrent(new MainForm()); }
public class MainForm extends Form {
public MainForm() {
super("MainForm");
addCommand(exitCommand);
append(textField);
setCommandListener(new CommandListener(){...});
setItemStateListener(new ItemStateListener(){...});
}
private TextField textField = new TextField("Type anything", null, 20, 0);
}
}
輔助類 BasicMIDlet 封裝生命週期。
CommandListener、ItemStateListener 移至主類實現,共用監聽器實例。Form 子類,直接實例化 Form 並配置。BasicMIDlet 僅被繼承一次,合併至主類,減少類文件。int[] arr = {0,1,2,3}; 編譯後生成逐條賦值指令,增大字節碼。改為:
getResourceAsStream() 讀取。import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ASO extends MIDlet implements CommandListener, ItemStateListener {
private Display display; private Form mainForm;
private TextField mainFormTF = new TextField("Type anything", null, 20, 0);
public static final Command exitCommand = new Command("Exit", Command.EXIT, 1);
public ASO() {}
public void commandAction(Command c, Displayable d) { if(c==exitCommand) exitMIDlet(); }
protected void destroyApp(boolean u) throws MIDletStateChangeException { exitMIDlet(); }
public void exitMIDlet() { notifyDestroyed(); }
public Display getDisplay() { return display; }
protected void initMIDlet() {
mainForm = new Form("MainForm");
mainForm.addCommand(exitCommand);
mainForm.setCommandListener(this);
mainForm.setItemStateListener(this);
mainForm.append(mainFormTF);
getDisplay().setCurrent(mainForm);
}
public void itemStateChanged(Item item) { if(item==mainFormTF) AlertType.INFO.playSound(getDisplay()); }
protected void pauseApp() {}
protected void startApp() throws MIDletStateChangeException {
if(display==null){ display=Display.getDisplay(this); initMIDlet(); }
}
}
優化後體積顯著縮減,技巧通用於所有 J2ME Profile。