您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何優化J2ME程序大小”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何優化J2ME程序大小”吧!
如果說j2me和j2se有什么最大的區別,那就是他們運行環境的不同.J2ME最主要的限制就在于它可用來存儲數據和運行程序的內存空間太小.當前大多數支持MIDP的設備,都限制了應用程序不得超于50K大小,這點兒就是千兆級的J2ME的服務運行環境大相徑庭.下面我們將學習一些技巧讓J2ME程序最小化 .下面就是一個最小化程序大小的例子:
XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
package com.j2medeveloper.techtips;
import Javax.microedition.lcdui.*;
public class BeforeSizeOptimization extends
BasicMIDlet {
public static final Command exitCommand =
new Command( "Exit",
Command.EXIT, 1 );
public BeforeSizeOptimization(){
}
protected void initMIDlet(){
getDisplay().setCurrent( new MainForm() );
}
public class MainFoRM extends Form {
public MainForm(){
super( "MainForm" );
addCommand( exitCommand );
append( textf );
setCommandListener( new CommandListener(){
public void commandAction( Command c,
Displayable d ){
if( c == exitCommand ){
exitMIDlet();
}
}
}
);
setItemStateListener(
new ItemStateListener() {
public void itemStateChanged(
Item item ){
if( item == textf ){
AlertType.INFO.playSound(
getDisplay() );
}
}
}
);
}
private TextField textf =
new TextField( "Type anything", null,
20, 0 );
}
}
雖然這個MIDlet在此僅作為一個例子,但使用的尺寸優化技巧可以適用于任一J2ME的profile上。
注意,上面的MIDlet類需要下面的輔助類:
package com.j2medeveloper.techtips;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public abstract class BasicMIDlet extends MIDlet {
private Display display;
public BasicMIDlet(){
}
protected void destroyApp( boolean unconditional )
throws MIDletStateChangeException {
exitMIDlet();
}
public void exitMIDlet(){
notifyDestroyed();
}
public Display getDisplay(){ return display; }
protected abstract void initMIDlet();
protected void pauseApp(){
}
protected void startApp()
throws MIDletStateChangeException {
if( display == null ){
display = Display.getDisplay( this );
initMIDlet();
}
}
}
如果用J2ME Wireless Toolkit運行這個例子,程序的大小大約4K左右.
為了更好的說明該怎么做,我們列出縮小程序大小需要注意的事項:
1, 去掉不必要的類,保證程序結構的簡潔 . 你有沒有考慮過,真的所有的特性都是你的程序所需要的么?你的用戶是否可以得到更簡潔的東西?考慮到這點,你的程序已經為最小化做好了準備.
2, 第二步就是深入考察程序定義的內部類,特別是匿名類。記住,每個類文件都有一定量的與之相關的系統開銷。即便最普通的類也有系統開銷。
public class foo {
// nothing here
}
編譯這個Class所在類文件,你需要200 bytes大小,再加上這個類的一些常規方法的實現,比如實現Event Listener接口等.而本身一個MIDlet就需要實現比如CommandListener, ItemStateListener接口, 如果可以的話,完全可以把他們用在一個文件中,多個類享受這一個commandAction , itemStateChanged ,不是很好么?雖然這需要你對程序的結構組織非常清晰:)
內部類也某些方面也會消耗內存空間 ,因為編譯器需要產生一些特殊的變量和方法來提供內部類入口的私有信息.
3 盡量使用現有的類。例如,基于CLDC的profile沒有構造集合類,所以我們可以用內建的Hashtable和Vector類來實現之。構造MIDP程序時也可采用此法。例子MIDlet中定義了一個form字類來生成主表,可以容易的如下直接生成:
mainform = new form( "Mainform" );
mainform.addCommand( okCommand );
mainform.setCommandListener( listener );
這里沒有對與錯, 因為這是很容易理解的。
4, 破壞程序的繼承關系。你也許把相關的代碼放到一個或多個抽象類中,這是OOD中為提高程序間代碼重用的推薦做法。雖然破壞繼承關系與你所學知識相違背,但簡化的繼承關系更有意義。特別的,當你的的抽象類――可能來自其他項目――僅僅被繼承一次時,破壞繼承關系的結果不言而喻。例如,例子MIDlet繼承了BasicMIDlet類,但兩者合并為一個類。
5, 盡量減少你創建的包,類,方法和成員變量的命名長度 . 這個聽起來似乎很無聊和愚蠢.不過一個類文件保存了許多的符號信息 簡短的命名將會使您簡化類文件 ,這個也許聽起來不是那么緊要,不過當幾個類衍生開去的時候,你就明白它的功效了.包已經有了一套成熟的簡化命名方式,盡量避免包的完整命名 ----- 在沒有和其他類沖突的情況下.
另外,簡短命名的工作并不總是需要手動完成,您完全可以使用工具來幫您完成,
”混淆器” 就是一個不錯的選擇 .它的主要目的就是對命名的一個優化(對你原有命名方式的一個隱藏和縮減).而這個過程最大的效果就是收縮應用程序的大小.這主要歸功于它對方法和數據變量的可讀性的重新命名(在編譯代碼中).
記得在使用混淆器之前需要預審核(preverification) , 否則混淆器會使類文件中的預審核數據無效.
6, 數組的初始化方式 .一個數組的初始化聲明如下:
int arr[] = { 0, 1, 2, 3 };
而實際編譯代碼如下::
arr[0] = 0;arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
這個過程可以通過使用Java 2 SDK中附帶的javap工具把二進制代碼反編譯成類文件去看(使用-c選項)。也許你會詫異于看到的內容,特別當你希望看到的是一排排二進制常數時。有兩種方法可以讓你看不到反編譯的程序代碼,(1)把數據編碼為字符串,運行時解碼之,或者(2)把數據存為二進制文件并與程序打包,用類裝載器的getResourceAsStream方法在運行時存取之。
以上只是一個指導方針,對J2ME程序而言,這里并沒有提到所有的步驟,不過大多數方法都可以應用到當前例子.最優化的MIDP例子如下:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ASO extends MIDlet
implements CommandListener,
ItemStateListener {
private Display display;
private Form mainForm;
private TextField mainFormTF =
new TextField( "Type anything", null,
20, 0 );
public static final Command exitCommand =
new Command( "Exit",
Command.EXIT, 1 );
public ASO(){
}
public void commandAction( Command c,
Displayable d ){
if( c == exitCommand ){
exitMIDlet();
}
}
protected void destroyApp( boolean unconditional )
throws MIDletStateChangeException {
exitMIDlet();
}
public void exitMIDlet(){
notifyDestroyed();
}
public Display getDisplay(){ return display; }
protected void initMIDlet(){
mainForm = new Form( "MainForm" );
mainForm.addCommand( exitCommand );
mainForm.setCommandListener( this );
mainForm.setItemStateListener( this );
mainForm.append( mainFormTF );
getDisplay().setCurrent( mainForm );
}
public void itemStateChanged( Item item ){
if( item == mainFormTF ){
AlertType.INFO.playSound( getDisplay() );
}
}
protected void pauseApp(){
}
protected void startApp()
throws MIDletStateChangeException {
if( display == null ){
display = Display.getDisplay( this );
initMIDlet();
}
}
}
感謝各位的閱讀,以上就是“如何優化J2ME程序大小”的內容了,經過本文的學習后,相信大家對如何優化J2ME程序大小這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。