空間站

          北極心空

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

           

          [轉(zhuǎn)貼自yesky]
          一、J2ME中需要的Java基礎(chǔ)知識(shí)
            現(xiàn)在有大部分人,都是從零開始學(xué)J2ME的,學(xué)習(xí)J2ME的時(shí)候,總是從Java基礎(chǔ)開始學(xué)習(xí),而且現(xiàn)在講Java基礎(chǔ)的書籍中都是以J2SE來講基礎(chǔ),這就給學(xué)習(xí)造成了一些不必要的麻煩,下面將J2ME中用到的和不需要的Java基礎(chǔ)知識(shí)做一個(gè)簡(jiǎn)單的說明。
            J2ME中使用到的Java基礎(chǔ)知識(shí):
             1、Java語法基礎(chǔ):包括基本數(shù)據(jù)類型、關(guān)鍵字、運(yùn)算符等等
             2、面向?qū)ο蟮乃枷耄侯惡蛯?duì)象的概念,繼承和多態(tài)等等。
             3、異常處理
             4、多線程
            J2ME中沒有用到的Java基礎(chǔ)知識(shí):
             1、JDK中javac和java命令的使用

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             2、Java基礎(chǔ)中的很多類在J2ME中沒有,或者類中的方法做了大量的精簡(jiǎn)。所以建議在J2ME中熟悉類庫。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             3、Applet、AWT、Swing這些知識(shí)在J2ME中根本使用不到。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            簡(jiǎn)單說這么多,希望學(xué)J2ME的朋友們能少走一些彎路,不足之處希望大家積極指正和補(bǔ)充。
            二、J2ME中暫時(shí)無法完成的功能
            列一些J2ME中暫時(shí)無法完成的功能,希望大家能積極補(bǔ)充:

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             1、在手機(jī)中不更改代碼實(shí)現(xiàn)移植,主要指游戲。
             2、動(dòng)態(tài)修改按鈕文字。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             3、在Canvas上接受中文輸入。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             4、操作本地資源、例如地址本、已收短信息等。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             5、制作破壞性的手機(jī)病毒。
             6、其他等待大家來補(bǔ)充。
            三、J2ME的跨平臺(tái)性
            J2ME技術(shù)源于Java,所以也具有JVM的優(yōu)勢(shì),可以在支持Java的平臺(tái)上進(jìn)行移植,但是現(xiàn)在的J2ME技術(shù)在跨平臺(tái)上卻做的很糟糕,我們來簡(jiǎn)單看一下原因:
            1、手機(jī)的屏幕尺寸不一:
            這個(gè)主要在界面制作上。如果你使用的是高級(jí)用戶界面,比如你做的是應(yīng)用開發(fā)或者用戶登陸、用戶注冊(cè)這樣的通用功能時(shí),一般沒有什么問題。
            如果你使用的是低級(jí)用戶界面,比如你做的是游戲,那么你就需要考慮這個(gè)問題了。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            2、廠商的擴(kuò)展API不統(tǒng)一:

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            例如Nokia的擴(kuò)展API類庫UI系列,在別的手機(jī)上或者沒有實(shí)現(xiàn),或者包名不同等等。
            3、手機(jī)平臺(tái)上實(shí)現(xiàn)的bug:
            例如Nokia的7650在實(shí)現(xiàn)雙緩沖上有bug,那么在這種機(jī)型上運(yùn)行的軟件就不能使用雙緩沖。其他NOKIA上的一些bug,可以參看:http://www.cnjm.net/resfetch/EKayXl5MlY2NaSIHXDqIdRYYOhhiXo2ZYQgiaQcmaY1ha4iyCKZijcsVFcqNFWSNy6SNZMvczstkOmF1THk_
            4、手機(jī)性能問題。
            不同手機(jī)的可用內(nèi)存、最大jar文件都有要求,例如Nokia S40的大部分手機(jī)支持的最大jar文件為64K,最大可用內(nèi)容為210K。
            所以現(xiàn)在的手機(jī)軟件,特別是游戲都提供支持的機(jī)型列表,也才有了手機(jī)游戲移植人員的存在。
            四、學(xué)習(xí)J2ME可以從事的工作種類
            現(xiàn)在J2ME技術(shù)可以說相當(dāng)?shù)幕鸨@里介紹一些學(xué)好了J2ME之后可以從事的工作的種類:
            1、J2ME游戲開發(fā)人員
            根據(jù)游戲策劃或者文檔要求,在某種特定的機(jī)型(以Nokia S40或S60居多)開發(fā)游戲程序。這是現(xiàn)在大部分J2ME程序員從事的工作。
            需要熟練掌握:高級(jí)用戶界面、低級(jí)用戶界面、線程,如果是網(wǎng)絡(luò)游戲,還需要熟練網(wǎng)絡(luò)編程。
            2、J2ME應(yīng)用開發(fā)人員

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            現(xiàn)在的移動(dòng)應(yīng)用還不是很多,但是還是出現(xiàn)了一些,特別是移動(dòng)定位以及移動(dòng)商務(wù)相關(guān)的內(nèi)容。需要熟練掌握:高級(jí)用戶界面、線程和網(wǎng)絡(luò)編程。
            3、J2ME游戲移植人員
            參照源代碼,將可以在一個(gè)平臺(tái)上可以運(yùn)行的游戲移植到其他平臺(tái)上去。例如將Nokia S40的游戲移植到S60上,或者索愛的T618等等。主要是控制屏幕坐標(biāo),有些可能需要替換一些API。
            需要熟悉各平臺(tái)之間的差異以及相關(guān)的技術(shù)參數(shù),比如屏幕大小、最大jar文件尺寸等等。
            五、J2ME程序設(shè)計(jì)的幾個(gè)原則
            1、使用面向?qū)ο缶幊獭?br>  雖然使用面向過程編程可以減小文件的尺寸,但是為了以后維護(hù)的方便和利于擴(kuò)展,還是要使用面向?qū)ο缶幊獭?br>  2、使用MVC模式
            將模型、界面和控制分離。現(xiàn)在很多的程序?qū)⑷吆弦唬侨绻阕龅某绦虮容^大的話,還是建議你進(jìn)行分離。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            3、自動(dòng)存儲(chǔ)用戶設(shè)定
            使用RMS來存儲(chǔ)用戶的信息,例如存儲(chǔ)用戶上次輸入的用戶名、密碼、用戶對(duì)于系統(tǒng)的設(shè)定等,這樣不僅可以減少用戶的輸入,而且對(duì)用戶友好。很多程序甚至做了自動(dòng)登陸等。
            4、一些系統(tǒng)設(shè)置允許用戶關(guān)閉。如背景音樂、背景燈顯示等。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            5、將低級(jí)用戶界面的繪制動(dòng)作放在一個(gè)獨(dú)立的線程里面去。
            6、在需要大量時(shí)間才能完成的工作時(shí),給用戶一個(gè)等待界面。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            六、從模擬器到真機(jī)測(cè)試
            對(duì)于J2ME開發(fā)者來說,模擬器給我們帶來了很多方便,比如可以在模擬器中調(diào)試程序以及很方便的察看程序的效果,但是模擬器也給我們帶來了一些問題,比如模擬器實(shí)現(xiàn)的bug等等,所以進(jìn)行真機(jī)測(cè)試是必須的。
            1、為什么要進(jìn)行真機(jī)測(cè)試?

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            因?yàn)槟M器程序可能存在bug,以及真機(jī)的性能有限,所以必須進(jìn)行真機(jī)測(cè)試。
            2、如何將程序傳輸?shù)綑C(jī)器中?
            將程序傳輸?shù)綑C(jī)器中有如下方式:
             a) OTA下載
             b) 使用數(shù)據(jù)線傳輸

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             c) 紅外傳輸

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             d) 藍(lán)牙
            你可以根據(jù)條件,選擇合適的方式。
            3、 真機(jī)測(cè)試主要測(cè)什么?

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            真機(jī)測(cè)試的內(nèi)容很多,主要測(cè)試以下幾個(gè)方面:
             a) 程序的功能
             b) 程序的操作性,是否易操作

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             c) 程序的大小,比如Nokia S40系列的手機(jī)大部分接受的最大文件尺寸為64K
             d) 程序運(yùn)行速度,速度是否可以忍受。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            七、從WTK到廠商SDK
            對(duì)于J2ME愛好者來說,基本上大家都是從SUN的WTK(J2ME Wireless Toolkit)開始的,但是對(duì)于實(shí)際應(yīng)用來說,僅僅使用WTK是遠(yuǎn)遠(yuǎn)不夠的,所以在學(xué)習(xí)過程中,必須完成從WTK到SDK的跨越。
            1、廠商SDK的下載地址?
            ·Nokia
            Nokia不愧為手機(jī)行業(yè)的老大,對(duì)于j2me的支持也是一流的,有專門的網(wǎng)站提供SDK和各種文檔說明。
            網(wǎng)址是:http://www.cnjm.net/resfetch/Dbvxamo8cwoKpIh4z44.G4iEykM.MYiOPzEbCpMx8QrKGwv7TD.xao4N
            ·Siemens

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            Siemens對(duì)于J2ME的支持也不錯(cuò),它提供了SDK,模擬器需要獨(dú)立安裝。下載地址如下:
          http://www.cnjm.net/resfetch/BVBDcHC9yrySkj0S7e24pIs9PnCLEqR77T4GZi5wS8qLLu0upMpLjS6SvRIGcD7qku0-i6RLPsq9OjfEPqTCQkUOt6kgPoukIC6kuEJFDnqpxC59cEJFDnqpvYuNDhSpPYuNDrepcIuNDuu3t7epOouNDrc_
            ·SonyEricsson

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            SonyEricsson SDK以及自己的模擬器,下載地址為:
           [url]http://developer.sonyericsson.com/site/global/docstools/java/p_java.jsp/url]
          http://www.cnjm.net/resfetch/BEe.ZGSB34qK5B9NqS2pZHWSH9stlFti26l4xsYfsFt4H-RbeLCKlGLEYi0fgeRisGSKlB-SsC0fQ5RFv6lkW0PGgQ__
            ·Motorola
            Motorola提供了專門的SDK,內(nèi)部包含模擬器,下載地址為:
          http://www.cnjm.net/resfetch/EKayXl5MlY2NPj4-OiYHXgeIBxZiazqIByaNJgdeB2sHImGNTIh1gAcmYjrBdUw_

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            ·SamSung

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            SamSung也提供了專門的SDK和模擬器,下載地址為:
          http://www.cnjm.net/resfetch/CnUnZGQjjsPDP7oJunRUI7phlNiAL9hs4OwvVP9FdLqUb1Qvw7rg7MOjYVTgZPn9VOC6w...2MP..9j5L4BF4JRL2CPfI.kvuuBs-UU.BC4p.v4_
            ·NEC:
            NEC也提供了集成模擬器的SDK,下載地址為:

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

          http://www.cnjm.net/resfetch/Ig9UMDBaS5eXGxsbLMm43HD4NMZquMmDLNzh-JfcyQ__
            2、廠商SDK和WTK有什么不同?

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            廠商SDK最簡(jiǎn)單的理解就是在WTK的基礎(chǔ)上增加了自己的模擬器和自己的擴(kuò)展API。也就是說,你在使用廠商的SDK時(shí),可以使用廠商的擴(kuò)展類庫,例如Nokia的UI類庫,和廠商自己的模擬器而已。每個(gè)廠商的擴(kuò)展API都不多,而且不盡相同。
            3、如何使用?
            有些廠商SDK的使用都和WTK相同,例如SamSung。Nokia提供了獨(dú)立的界面來開發(fā),但是這個(gè)界面在實(shí)際開發(fā)中使用不多。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            4、廠商SDK的問題

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            廠商SDK實(shí)現(xiàn)過程中,有一些bug,而且和真機(jī)實(shí)現(xiàn)不一致。例如NOKIA的混音播放問題等等。
            八、在J2ME中獲得手機(jī)IMEI的方法
            IMEI是Internation mobile entity identification的簡(jiǎn)稱,在手機(jī)中輸入*#06#可以顯示該數(shù)字,長(zhǎng)度為15位,全球唯一,永遠(yuǎn)不會(huì)沖突,所以可以作為識(shí)別用戶的一個(gè)標(biāo)志。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            下面是在J2ME中獲得IMEI的方法:
            1、MOTO系列的手機(jī)可以通過讀取系統(tǒng)的IMEI屬性獲得,代碼如下:

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

             String imei = System.getProperty("IMEI");
            2、SIEMENS系列的手機(jī)可以通過讀取系統(tǒng)的com.siemens.IMEI屬性獲得,代碼如下:
             String imei = System.getProperty("com.siemens.IMEI");
            九、J2ME網(wǎng)絡(luò)連接中顯示問題的解決辦法

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            在網(wǎng)絡(luò)編程中,有些時(shí)候會(huì)出現(xiàn)一些在沒有接收到網(wǎng)絡(luò)數(shù)據(jù)就顯示界面的,造成界面顯示不符合要求(例如公告顯示,會(huì)先顯示公告的背景圖片再顯示公告信息),這里提一個(gè)簡(jiǎn)單的解決辦法給大家:

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            解決這種情況的方法分成三個(gè)步驟:
            1、在需要顯示的界面中,調(diào)用發(fā)送網(wǎng)絡(luò)數(shù)據(jù)的方法。每次顯示時(shí)調(diào)用該構(gòu)造方法,不調(diào)用Display的setCurrent方法顯示。

          JAVA手機(jī)網(wǎng)[www.cnjm.net]

            2、顯示等待界面(例如進(jìn)度條等),給用戶提示,在進(jìn)行網(wǎng)絡(luò)連接。
            3、在處理網(wǎng)絡(luò)反饋的數(shù)據(jù)完以后,調(diào)用Display的setCurrent方法顯示顯示當(dāng)前界面。

          ===========================================================================

          本文轉(zhuǎn)自解正宇朋友的《手機(jī)Java之怪現(xiàn)象》,個(gè)人感覺對(duì)我等初學(xué)者幫助非常大,故此轉(zhuǎn)貼,由于不知道原文所出網(wǎng)址,這里表示歉意。

           

           

          下面記載的都是手機(jī)java實(shí)現(xiàn)中各種奇怪的毛病,bug,或者……特性,是根據(jù)某項(xiàng)目的開發(fā)經(jīng)驗(yàn)總結(jié)出來的。但是涵蓋的手機(jī)型號(hào)還是有限。因此很有可能某些“特性”會(huì)存在于更多的采用了相同JVM(比如平臺(tái)相同、生產(chǎn)廠商)的手機(jī)上。
                                                                                            == 早期S60的內(nèi)存泄漏 ==
          這個(gè)bug可以上溯至2003年,甚至更早。表現(xiàn)為java應(yīng)用中如果使用了Class.getResourceAsStream("本地文件")無法釋放其占用的內(nèi)存,是的,沒有任何辦法,無論是調(diào)用獲得的的InputStream實(shí)例的close()或?qū)⑵湓O(shè)為null,甚至顯式強(qiáng)制System.gc(),都沒有效果。結(jié)果就是至少和本地文件同尺寸的內(nèi)存成為了無法回收的垃圾。這個(gè)問題還影響到以Class.getResourceAsStream()為基礎(chǔ)的Image.createImage()(這個(gè)是最要命的,如何能夠不使用圖片資源呢!)。
          這個(gè)bug據(jù)說在新的S60上已經(jīng)解決了。但是Nokia3230(4.0526.2ch)、Nokia7610(6.0525.0ch)都存在這個(gè)問題。對(duì)于這些個(gè)有問題的機(jī)型,在java程序中是無法完美解決這個(gè)問題的,只能盡量避免。比如集中、統(tǒng)一載入資源,永不釋放(也就是說,盡量控制泄漏的次數(shù))。當(dāng)然,這會(huì)對(duì)已有代碼造成很大影響。畢竟手機(jī)java應(yīng)用是內(nèi)存受限系統(tǒng)的典型,大多數(shù)情況下,珍貴的內(nèi)存中只保留需要的資源。
                                                                                            == 鍵盤響應(yīng)事件 ==
          在MIDP1中,獲取鍵盤事件只能自己實(shí)現(xiàn)Canvas.keyPressed()。但是MotorolaE398和SonyEricssonK700c的實(shí)現(xiàn)卻很奇怪。表現(xiàn)為左右軟鍵有可能在這個(gè)方法中捕獲不到。而是否能夠成功捕獲,取決于keyPressed()方法中代碼的行數(shù)……
          我承認(rèn)我沒徹底搞清楚這其中的玄機(jī)。鬼知道Motorola和SonyEricsson是怎么實(shí)現(xiàn)的JVM。我只知道把keyPressed中的所有代碼提取到另外一個(gè)函數(shù)中,在keyPressed只把參數(shù)傳遞給新函數(shù),問題就消失了……
                                                                                            == 超慢的drawRegion ==
          除了N-Gage QD,幾乎所有的NokiaS60手機(jī)都實(shí)現(xiàn)了MIDP2的支持。MIDP2中,最為重要的幾個(gè)特性之一就是Graphics.drawRegion。這個(gè)API可以方便的將圖片旋轉(zhuǎn)、剪切之后畫到畫布上。
          但是,這個(gè)API在Nokia3230、Nokia7610等手機(jī)上的實(shí)際性能表現(xiàn)讓人實(shí)在不敢恭維。于是,這個(gè)最重要的API成了擺設(shè)……沒什么怎么辦,只能急需延用MIDP1的做法,自己實(shí)現(xiàn)剪切和旋轉(zhuǎn),或者像我一樣懶,直接要求美工把旋轉(zhuǎn)之后的圖片全都做出來……
                                                                                            == 詭異的內(nèi)存容量 ==
          按照官方Spec,Java在Nokia3125上的可用內(nèi)存(即Java Heap Size)為512k。但是實(shí)際測(cè)試的結(jié)果是,Nokia3125只有412k左右的實(shí)際內(nèi)存,相差整整100k。不過好在Nokia3125并不是種市場(chǎng)保有量很高的型號(hào)。但是它是我正在使用的型號(hào)……
                                                                                            == 無法repaint ==
          這個(gè)問題只存在于SonyEricssonK700c。表現(xiàn)為在keyPressed()中調(diào)用repaint()進(jìn)行屏幕重畫沒有任何反映。
          解決辦法是,在keyReleased()中補(bǔ)一個(gè)repaint()……
                                                                                            == UTF8 ==
          還是SonyEricssonK700c的問題。問題存在于new String(byte[], charset)上。也就是說,當(dāng)獲得了某個(gè)byte[],并希望用UTF8作為字符集將其轉(zhuǎn)換為字符串的時(shí)候,使用上述方法在SonyEricssonK700c上會(huì)出現(xiàn)丟失字符的現(xiàn)象。這個(gè)現(xiàn)象很詭異,以至于我目前沒有搞清楚什么情況下會(huì)丟失字符(我甚至專門寫了個(gè)測(cè)試程序在真機(jī)上跑,得出的結(jié)論是丟失字符的原因可能會(huì)很復(fù)雜,簡(jiǎn)單的拿被丟掉字符附近的一個(gè)子串來測(cè)沒有任何問題)。
          幸虧還是有解決辦法的。不用new String就完了,而要用更加麻煩的辦法,比如像我一樣,用ByteArrayInputStream,外面套InputStreamReader(bais, "UTF8"),然后用StringBuffer一個(gè)一個(gè)char讀進(jìn)來,最后再toString()……
                                                                                            == 不可靠的copyArea ==
          這是Motorola機(jī)器上的問題,V3和E398都有。copyArea是Graphics的作整塊屏幕像素copy的常用API(2D動(dòng)態(tài)背景的游戲幾乎是必不可少)。按照Sun官方的Spec,手機(jī)廠商有義務(wù)來保證其API實(shí)現(xiàn)不存在覆蓋沖突問題。但是Motorola顯然做得不夠好。在Motorola手機(jī)上使用這個(gè)API會(huì)隨機(jī)產(chǎn)生貼圖混亂的情況……
          解決辦法是自己實(shí)現(xiàn)另外一套機(jī)制。比如使用另外一張至少和屏幕同樣大小的Image作為緩沖,用兩次drawImage來替代copyArea……不過這個(gè)方法顯而易見的缺點(diǎn)是消耗了更多的內(nèi)存(那可是不小于屏幕尺寸的Image啊!)。如果內(nèi)存實(shí)在吃緊,只能退而再求其次,作為緩沖的Image繼續(xù)縮水,drawImage的次數(shù)繼續(xù)增加……不過這個(gè)時(shí)候需要自己手工解決覆蓋沖突……
                                                                                            == 無法安靜下來的3220 ==
          不知道這個(gè)問題是不是在S40平臺(tái)上都有,手里S40又支持MIDI的手機(jī)實(shí)在是太少了……
          3220的一個(gè)很明顯的特征就是聲音大。以至調(diào)用了VolumeControl.setLevel(0)之后還是有聲音,和Sun官方的Spec完全不符……沒辦法,只能在需要靜音的時(shí)候,再補(bǔ)一個(gè)VolumeControl.setMute(true)。
                                                                                            == 永不ready ==
          這是一段手機(jī)java獲取網(wǎng)絡(luò)數(shù)據(jù)的常用代碼:while(InputStream.ready()) { InputStream.read() }。
          但是經(jīng)測(cè)試,在Nokia3230上,這個(gè)ready永遠(yuǎn)返回false……沒辦法,如果不改上述代碼的話,就自己實(shí)現(xiàn)一個(gè)繼承類吧。

          posted on 2007-07-27 17:27 蘆葦 閱讀(1039) 評(píng)論(1)  編輯  收藏 所屬分類: IDEJAVA

          Feedback

          # re: 關(guān)于J2ME開發(fā)的一些資料 2007-08-22 22:08 shevchenko
          謝謝,很有幫助  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 松原市| 哈密市| 依兰县| 曲沃县| 出国| 霍林郭勒市| 潮安县| 金湖县| 永福县| 肇庆市| 凌海市| 宁蒗| 乐至县| 嵩明县| 石门县| 廊坊市| 若尔盖县| 孙吴县| 潮州市| 黄骅市| 汝阳县| 彝良县| 迁西县| 衡水市| 新巴尔虎左旗| 康定县| 德格县| 儋州市| 徐州市| 青州市| 邓州市| 依兰县| 大埔区| 新平| 仪陇县| 攀枝花市| 青岛市| 石河子市| 斗六市| 青川县| 富裕县|