圖片屬二進位資料,傳輸方式與基本類型不同。本文示範用 HttpConnection 下載圖片,配合 ByteArrayOutputStream 接收資料流,最後以 Image.createImage(byte[]) 重建圖片並顯示。
GetterThread 背景執行緒負責下載,透過 wait()/notify() 同步啟動。midlet.setImage(Image) 更新 UI。public class ImageGetter extends MIDlet implements CommandListener {
private Display display;
private static final Command CMD_CONNECT = new Command("Connect", Command.ITEM, 1);
private static final Command CMD_EXIT = new Command("Exit", Command.EXIT, 1);
private Form mainForm;
private GetterThread getter;
protected void startApp() {
display = Display.getDisplay(this);
mainForm = new Form("Image Getter");
mainForm.append("Click Connect to get Image");
mainForm.addCommand(CMD_CONNECT);
mainForm.addCommand(CMD_EXIT);
mainForm.setCommandListener(this);
display.setCurrent(mainForm);
getter = new GetterThread(this);
getter.start();
}
public void setImage(Image img) {
mainForm.append(img);
display.setCurrent(mainForm);
}
public void commandAction(Command c, Displayable d) {
if (c == CMD_CONNECT) {
synchronized (this) { notify(); } // 喚醒下載執行緒
} else if (c == CMD_EXIT) {
destroyApp(false); notifyDestroyed();
}
}
class GetterThread extends Thread {
private final ImageGetter midlet;
private static final String URL = "https://localhost/J2MEdev.png";
public GetterThread(ImageGetter midlet) { this.midlet = midlet; }
public void run() {
synchronized (midlet) {
try { midlet.wait(); } // 等待使用者點擊 Connect
catch (InterruptedException e) { e.printStackTrace(); }
}
System.out.println("connect to server...");
HttpConnection conn = null;
InputStream is = null;
try {
conn = (HttpConnection) Connector.open(URL);
is = conn.openInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int ch;
while ((ch = is.read()) != -1) baos.write(ch);
byte[] data = baos.toByteArray();
Image img = Image.createImage(data, 0, data.length);
midlet.setImage(img);
baos.close(); is.close(); conn.close();
} catch (IOException e) { e.printStackTrace(); }
}
}
}
GetterThread 啟動後即 wait(),使用者點擊 Connect 時主 MIDlet notify() 喚醒,避免阻塞 UI 執行緒。ByteArrayOutputStream 累積位元組,再 toByteArray() 取得完整圖片資料。J2MEdev.png) 供測試。Content-Length 計算進度並回呼 UI。HTTP 下載圖片在 J2ME 中屬基礎網路操作,掌握「背景執行緒 + 位元組流累積 + 圖片重建」三步驟,即可輕鬆實現。