首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 透過 HTTP 協定傳輸圖片:完整範例與執行緒處理

     編輯:J2ME

前言

圖片屬二進位資料,傳輸方式與基本類型不同。本文示範用 HttpConnection 下載圖片,配合 ByteArrayOutputStream 接收資料流,最後以 Image.createImage(byte[]) 重建圖片並顯示。

架構設計

  • 主 MIDlet 負責 UI 與命令處理。
  • 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(); }
        }
    }
}

關鍵細節

  1. 執行緒同步:GetterThread 啟動後即 wait(),使用者點擊 Connect 時主 MIDlet notify() 喚醒,避免阻塞 UI 執行緒。
  2. 資料流接收:用 ByteArrayOutputStream 累積位元組,再 toByteArray() 取得完整圖片資料。
  3. 錯誤處理:網路操作需完整 try-catch-finally,確保連線、串流正確關閉。
  4. 伺服器端:需放置一張適中大小的 PNG 圖片 (如 J2MEdev.png) 供測試。

擴充建議

  • 加入進度條:在讀取迴圈中依 Content-Length 計算進度並回呼 UI。
  • 支援斷點續傳:配合 HTTP Range 標頭。
  • 快取機制:將下載圖片存入 RMS,下次直接讀取。

結語

HTTP 下載圖片在 J2ME 中屬基礎網路操作,掌握「背景執行緒 + 位元組流累積 + 圖片重建」三步驟,即可輕鬆實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved