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

J2ME 定位 API 開發實戰:ProviderQueryUI 類完整實現指南

     編輯:J2ME

ProviderQueryUI 類核心架構解析

在 J2ME 定位應用開發中,ProviderQueryUI 類負責管理定位服務提供者的查詢與用戶交互介面。本文深入剖析其完整實現邏輯,涵狀態提示、費用確認對話框及線程同步機制。

類結構與核心組件

package com.nokia.example.location.tourist.ui;

import javax.microedition.lcdui.*;
import com.nokia.example.location.tourist.TouristMIDlet;

public class ProviderQueryUI {
    // 狀態顯示表單
    private Form searchForm = new Form("正在搜尋定位提供者...");
    private StringItem infoItem = new StringItem("狀態:", "");
    
    // 用戶決策命令
    private Command yesCmd = new Command("是", Command.OK, 1);
    private Command noCmd = new Command("否", Command.STOP, 1);
    private boolean result = false; // 用戶是否允許付費服務
    
    // 預定義訊息常量
    private static final String COST_QUERY_MESSAGE = 
        "找不到免費定位提供者。是否繼續搜尋可能產生費用的提供者?";
    private static final String OUT_OF_SERVICE_MESSAGE = 
        "所有定位提供者目前均不可用。請確認定位模組已正確連接。";
    // ... 其他訊息常量
}

關鍵方法實現詳解

1. 建構子初始化

public ProviderQueryUI() {
    infoItem.setText("正在搜尋免費定位提供者...");
    searchForm.append(infoItem);
}

2. 錯誤狀態顯示方法

public void showOutOfService() {
    Alert alert = new Alert("錯誤", OUT_OF_SERVICE_MESSAGE, null, AlertType.ERROR);
    alert.setTimeout(Alert.FOREVER);
    TouristMIDlet.getDisplay().setCurrent(alert, searchForm);
    infoItem.setText("請在定位模組正確連接後重試。");
}

public void showNoFreeServiceFound() {
    Alert alert = new Alert("錯誤", NO_FREE_SERVICE_SERVICE_MESSAGE, null, AlertType.ERROR);
    alert.setTimeout(Alert.FOREVER);
    TouristMIDlet.getDisplay().setCurrent(alert, searchForm);
    infoItem.setText("請在定位模組正確連接後重試。");
}

3. 付費服務確認對話框(線程同步核心)

public synchronized boolean confirmCostProvider() {
    Alert alert = new Alert("確認", COST_QUERY_MESSAGE, null, AlertType.CONFIRMATION);
    alert.addCommand(yesCmd);
    alert.addCommand(noCmd);
    alert.setTimeout(Alert.FOREVER);
    
    final ProviderQueryUI hinstance = this;
    alert.setCommandListener(new CommandListener() {
        public void commandAction(Command command, Displayable d) {
            if (command == yesCmd) {
                infoItem.setText("正在搜尋可能產生費用的提供者...");
                result = true;
                synchronized (hinstance) { hinstance.notifyAll(); }
            } else if (command == noCmd) {
                result = false;
                infoItem.setText("請在定位模組正確連接後重試。");
                synchronized (hinstance) { hinstance.notifyAll(); }
            }
        }
    });
    
    TouristMIDlet.getDisplay().setCurrent(alert, searchForm);
    
    // 阻塞等待用戶決策
    try { wait(); } 
    catch (InterruptedException e) { e.printStackTrace(); }
    
    TouristMIDlet.getDisplay().setCurrent(searchForm);
    return result;
}

設計亮點與最佳實踐

  • 同步機制:使用 synchronized 與 wait()/notifyAll() 實現 UI 線程與業務邏輯線程的安全協作
  • 狀態封裝:將所有 UI 狀態訊息集中管理,便於維護與本地化
  • 資源釋放:確保 Alert 顯示後正確恢復主表單,避免介面殘留

此類別展示了 J2ME 中處理阻塞式用戶交互的經典模式,適用於所有需要用戶確認才能繼續的場景。

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