亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

實戰程序管理器和多語言程序

2019-11-18 16:10:42
字體:
來源:轉載
供稿:網友

這兩天又研究了一下MIDlet程序的設計方法,發現通過寫一個程序管理器可以大大方便MIDlet編程,并在這個基礎上擴展了多語言支持。

在MIDlet編程中,很多系統的屬性要通過一個MIDlet實例來訪問,比如Display.getDisplay,那么在需要切換界面的類里面你必須把MIDlet實例或者Display實例傳送給他,尤其在設計彈出和可以返回的界面時。沒有更好的辦法嗎?又比如程序的暫停功能,有沒有根方便的方法把他們集成起來?還有錯誤處理,程序退出等等,利用以往的方法是不是很不爽?

嗯,真是不爽,于是我寫了這個程序管理器:App。首先看他的組織方式:

 static App instance;
 Display disp_;
 MIDlet app_;
 public static void createInstance(MIDlet app)
 {
  if(instance==null)
   instance=new App();
  instance.app_=app;
  instance.disp_=Display.getDisplay(app);
 }
 PRivate App()
 {
  
 }

每個MIDlet只需要一個管理器,所以只允許一個實例。這樣,我們就可以通過靜態方法提供一些系統參數的訪問方法:

    public static String getProperty(String name)
    {
        return instance.app_.getAppProperty(name);
    }
 public static Display getDisplay()
 {
  return instance.disp_;
 }

他還應該提供返回前一屏的功能,如何實現呢?既然有了display,難道每次還是要App.getDisplay().setCurrent(xxx)?索性提供一個App.setCurrent():

 public static void setCurrent(Displayable d)
 {
        if(d!=instance.old_)
        {
            instance.old_=instance.disp_.getCurrent();
            instance.disp_.setCurrent(d);
        }
 }

對了,我們就利用這個來實現切換到前一屏的功能:

 public static void restore()
 {
        if(instance.old_!=null)
        {
            instance.disp_.setCurrent(instance.old_);
            instance.old_=null;
        }
 }

接下去該輪到程序暫停和恢復的處理以及一些常用命令

    public static boolean restart()
    {
        if(instance.paused_)
        {
            instance.disp_.setCurrent(instance.bef_);
            instance.paused_=false;
            return true;
        }
        else
            return false;
    }
    public static void pause()
    {
        instance.bef_=instance.disp_.getCurrent();
        instance.paused_=true;
    }
 public static void exit()
 {
  instance.app_.notifyDestroyed();
 }
    public static void handleError(String msg, Exception ex)
    {
        System.out.println(msg+"::"+ex);
    }


下面講述多語言支持的集成。語言選擇當然需要一個界面,就是這個:

    class LanguageMenu extends List implements CommandListener
    {
        Command cmdOK_;
        Object[] langlist_=new Object[]{
                "Chinese","zh_cn",null,
                "USA","en_us",null
        };

        public LanguageMenu()
        {
            super("Select Language",List.IMPLICIT);
            for(int i=0;i            {
                this.append((String)langlist_[i],(Image)langlist_[i+2]);
            }
            cmdOK_=new Command("OK",Command.SCREEN,2);
            this.addCommand(cmdOK_);
            this.setSelectCommand(cmdOK_);
            this.setCommandListener(this);
        }
       
        public void commandAction(Command c, Displayable d) {
            if(c==cmdOK_)
            {
                         。。。
            }
        }
    }

這個時候又碰到了一個在實現SNProtector的時候碰到的問題,如何中斷程序然后在用戶確認后繼續執行?在制作SNProtector的時候采用了Pause-Resume的方法實現了功能,但是效果不太理想。那只好自己多寫些代碼避免用戶的麻煩。

這個方法通過引入一個IApp的接口,MIDlet類要實現這個接口:

    public interface IApp
    {
        public void start();
    }

然后把原來在startApp的內容放入start之中。在App中增加一個方法:

    static void continueRun()
    {
        if(instance.app_ instanceof IApp)
        {
            ((IApp)instance.app_).start();
        }
    }


嗯,好了,然后該具體實現一下語言選擇菜單了:

    class LanguageMenu extends List implements CommandListener
    {
        Command cmdOK_;
        Object[] langlist_=new Object[]{
                "Chinese","zh_cn",null,
                "USA","en_us",null
        };

        public LanguageMenu()
        {
            super("Select Language",List.IMPLICIT);
            for(int i=0;i            {
                this.append((String)langlist_[i],(Image)langlist_[i+2]);
            }
            cmdOK_=new Command("OK",Command.SCREEN,2);
            this.addCommand(cmdOK_);
            this.setSelectCommand(cmdOK_);
            this.setCommandListener(this);
        }
       
        public void commandAction(Command c, Displayable d) {
            if(c==cmdOK_)
            {
                int cmd=this.getSelectedIndex();
                instance.lang_=(String)langlist_[cmd*3+1];
                try
                {
                    RecordStore.deleteRecordStore(LanguageRMS);
                }
                catch(Exception ex)
                {
                }
                try
                {
                    RecordStore rs=RecordStore.openRecordStore(LanguageRMS,true);
                    byte[] buf=instance.lang_.getBytes();
                    rs.addRecord(buf,0,buf.length);
                    rs.closeRecordStore();
                }
                catch(Exception ex)
                {
                }
                continueRun();
            }
        }
    }


同樣通過RMS保存了用戶的選項,不用每次都選擇,最后當然需要有個函數對這些工作進行調度:

    public static boolean selectLanguage()
    {
        boolean r=(instance.lang_!=null);
        if(!r)
        {
            try
            {
                RecordStore rs=RecordStore.openRecordStore(LanguageRMS,true);
                RecordEnumeration e=rs.enumerateRecords(null,null,false);
                if(e.hasNextElement())
                {
                    instance.lang_=new String(e.nextRecord());
                    r=true;
                }
                else
                {
                    r=false;
                }
                rs.closeRecordStore();
            }
            catch(Exception ex)
            {
                r=false;
            }
            if(!r)
            {
                App.setCurrent(instance.new LanguageMenu());
            }
        }
        return r;
    }

程序管理器寫完了,那么如何把他整合進MIDlet里面?看一下幾個主要的函數就清楚了:

 public TestSM()
 {
  App.createInstance(this);
 }
 
 protected void startApp() throws MIDletStateChangeException {
        if(App.selectLanguage() && !App.restart())
        {
            start();
        }
 }
   
    public void start()
    {
        SM.getInstance(App.getLanguage()).load("1");
        App.setCurrent(new TestCanvas());
    }


 protected void pauseApp() {
        App.pause();
 }

ok,這回是大功告成了。總結一下他的優點:
1。在需要返回前一屏的地方只需要一個App.restore();
2。自動處理暫停和恢復;
3。隨時取得系統參數App.getProperty();
4。統一的錯誤處理;
5。整合多語言功能;
6。更方便的切換屏幕,只需要App.setCurrent()。

你還有更多的好主意嗎?跟我分享一下如何?
有意見或建議請聯系vmlinuxx@Gmail.com,共同學習,共同提高:)

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线视频免费观看| 中文字幕日韩精品在线观看| 国内精品美女av在线播放| 伊人伊成久久人综合网小说| 亚洲综合大片69999| 伊人伊成久久人综合网站| 国产欧美日韩精品丝袜高跟鞋| 欧美区二区三区| 久久久久久美女| 国产精品黄页免费高清在线观看| 日韩精品免费在线视频| 亚洲一区中文字幕在线观看| 国产欧美中文字幕| 国产精品女人久久久久久| 亚洲va电影大全| 欧美人与性动交a欧美精品| 国产精品福利小视频| 91久久国产综合久久91精品网站| 国产精品一区二区av影院萌芽| 亚洲精品国产电影| 中文国产成人精品久久一| 久久精品视频在线观看| 成人免费观看49www在线观看| 欧美午夜性色大片在线观看| 亚洲国产成人精品女人久久久| 成人免费视频网址| 91久久精品国产91久久性色| 欧美黄色小视频| 精品久久久久久久久久国产| 色综合老司机第九色激情| 中国china体内裑精亚洲片| 久久国产精品久久久久久久久久| 久久国产色av| 国产精品视频大全| 亚洲韩国日本中文字幕| 91免费看国产| 亚洲国产91色在线| 国产91对白在线播放| 国产精品亚洲自拍| 成人激情视频小说免费下载| 热re91久久精品国99热蜜臀| 亚洲国产91色在线| 欧美激情在线狂野欧美精品| 国自在线精品视频| 欧美国产高跟鞋裸体秀xxxhd| 欧美黄色片免费观看| 91沈先生在线观看| 国内免费精品永久在线视频| 插插插亚洲综合网| 亚洲天堂av在线免费观看| 欧美日韩国产一区二区| 欧美日韩亚洲一区二| 国产一区二区三区在线视频| 亚洲欧美日韩国产中文专区| 成人深夜直播免费观看| 国产亚洲免费的视频看| 国产午夜精品免费一区二区三区| 国产91精品网站| 视频在线一区二区| 国产欧美在线看| 国产日韩欧美中文| 在线观看日韩专区| 日韩精品视频三区| 欧美成人免费视频| 国语自产精品视频在线看| 亚洲黄色在线观看| 国产精品一区二区性色av| 色婷婷综合久久久久| 欧美精品激情视频| 精品网站999www| 国产一区二区久久精品| 亚洲人成网在线播放| 亚洲美女动态图120秒| 日韩欧美在线视频| 欧美电影免费观看高清| 国产精品99久久久久久www| 久久久久日韩精品久久久男男| 亚洲精品乱码久久久久久金桔影视| 最近2019中文字幕大全第二页| 欧美日韩人人澡狠狠躁视频| 亚洲精品v欧美精品v日韩精品| 国产精品美女午夜av| 久久中文久久字幕| 精品亚洲永久免费精品| 国产精品久久久久av免费| 91影院在线免费观看视频| 久久亚洲春色中文字幕| 韩国三级电影久久久久久| 伦伦影院午夜日韩欧美限制| 97视频在线观看成人| 国模叶桐国产精品一区| 日韩网站免费观看高清| 91亚洲精品久久久| 亚洲最大福利视频网站| 欧美黑人xxxⅹ高潮交| 中文字幕av一区中文字幕天堂| 日韩欧美亚洲范冰冰与中字| 91豆花精品一区| 欧美精品在线视频观看| 日韩有码在线播放| 久久久精品中文字幕| 欧美激情区在线播放| 国产美女直播视频一区| 一区二区三欧美| 黑人欧美xxxx| 2020国产精品视频| 国产精品www| 国产成人免费av| 国产亚洲精品高潮| 亚洲激情国产精品| 日韩电影在线观看中文字幕| 欧美在线视频一区| 国产主播欧美精品| 国产日韩欧美中文| 中文字幕欧美日韩| 亚洲大胆人体av| 欧美大尺度电影在线观看| 欧美视频免费在线观看| 91tv亚洲精品香蕉国产一区7ujn| 国产精品久久久久久久久久久久| 亚洲无限乱码一二三四麻| 国产日韩精品综合网站| 欧美成人性生活| 91免费人成网站在线观看18| 亚洲黄一区二区| 97国产真实伦对白精彩视频8| 久久久久久999| 成人午夜一级二级三级| 2020欧美日韩在线视频| 国产欧美精品一区二区三区介绍| 一区二区福利视频| 欧美视频裸体精品| 日韩午夜在线视频| 性日韩欧美在线视频| 国产精品久久久久久搜索| 亚洲毛茸茸少妇高潮呻吟| 国产亚洲精品高潮| 在线播放国产一区二区三区| 久久精品成人欧美大片古装| 亚洲最大的av网站| 亚洲色图美腿丝袜| 亚洲精品99999| 亚洲一区二区久久久| 亚洲字幕在线观看| 日韩精品视频免费在线观看| 亚洲天堂视频在线观看| 高跟丝袜一区二区三区| 欧美国产中文字幕| 欧美性受xxxx白人性爽| 77777少妇光屁股久久一区| 亚洲天堂av网| 中文字幕一区日韩电影| 激情久久av一区av二区av三区| 欧美成人激情视频免费观看| 尤物九九久久国产精品的特点| 成人黄色大片在线免费观看| 在线观看亚洲视频| 欧美洲成人男女午夜视频| 国产亚洲精品久久久久动| 色综合男人天堂| 国产精品中文字幕久久久| 日本国产精品视频| 久久久精品在线| 亚洲综合大片69999|