如何優(yōu)化J2ME應用程序-創(chuàng)新互聯(lián)

這篇文章主要介紹“如何優(yōu)化J2ME應用程序”,在日常操作中,相信很多人在如何優(yōu)化J2ME應用程序問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何優(yōu)化J2ME應用程序”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設計、成都網(wǎng)站設計與策劃設計,寧遠網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設10年,網(wǎng)設計領(lǐng)域的專業(yè)建站公司;建站業(yè)務涵蓋:寧遠等地區(qū)。寧遠做網(wǎng)站價格咨詢:18980820575

如果要說j2me應用程序和j2se應用程序有什么不同的地方的話,那就是他們各自被限制運行的環(huán)境。
很多J2ME系統(tǒng)的主要的瓶頸是存儲和運行應用程序的可用內(nèi)存數(shù)量。舉例來說,當前許多MIDP設備,他們
限制給應用程序的內(nèi)存數(shù)量就只有50K或更少,離可能要求兆級的基于服務端J2SE環(huán)境有段很長的距離。
由于你在開發(fā)中會很容易就遭遇這些限制,所以在這篇J2ME技術(shù)提示中,你會學到如何讓你的應用程序占用最
少的內(nèi)存。你將用這些技術(shù)減少MIDlet占用的空間,MIDlet只是顯示一個文本框并且在其中內(nèi)容被更改
的時候發(fā)出聲音:
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,但是其中用到的技術(shù)可以用來優(yōu)化任何J2ME程序。
注意上面演示的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打包以后,這個MIDlet例子僅僅4K多一點。

減少size的第一步是通過減少應用程序功能來移除一些不必要的類。你的應用程序的每個特性都是真的必要的嗎?
你的用戶能否忍受沒有鈴聲和哨聲?讓我們來建立最小版本的應用程序。注意到MIDlet例子已經(jīng)是相當小的了。

第二步著眼于應用程序定義的內(nèi)部類,特別是匿名類。記住每一個類文件都有一定相應的空間開支。甚至最微不足道的
類也需要成本:
  public class foo {
  // nothing here
  }
編譯這個類,你可以發(fā)現(xiàn)你得到一個占用幾乎200字節(jié)空間的class文件。一個匿名類一般用途是用來實現(xiàn)事件監(jiān)聽。
MIDlet例子定義了兩個listener。一個簡單優(yōu)化就是讓MIDlet的主類實現(xiàn)CommandListener和ItemStateListener
兩個接口,刪除里面的listener代碼。記住多個對象可以使用相同的listener。如果需要區(qū)別開來,
可以傳遞參數(shù)給commanAction和itemStateChanged方法。

內(nèi)部類也會通過其他方面膨脹代碼,因為編譯器必須產(chǎn)生不同的變量和方法來允許一個內(nèi)部類訪問封裝類里面的私有信息。

第三步是大程度使用內(nèi)置的類。舉個例子,在基于CLDC的程序中不要建立你自己的集合類。盡量使用內(nèi)置的Hashtable
和Vector。設計MIDP應用也是一樣。MIDlet例子定義了一個Form子類來創(chuàng)建它的主form,但它還能被很容易地直接創(chuàng)建:
  mainForm = new Form( "MainForm" );
  mainForm.addCommand( okCommand );
  mainForm.setCommandListener( listener );
這里沒有對和錯的問題,這只是需要考慮的一些簡單的東西。

第四步是取消你應用程序的繼承關(guān)系。你可能已經(jīng)將代碼分解成一個或多個抽象類,這是個被推薦的能提高代碼重用
的OOD設計方法。也許會跟你學到的東西有抵觸,但去簡化繼承層次更加說的過去。如果你的抽象類——可能來自其他項目——
只是被繼承了一次,那簡化繼承關(guān)系就顯得特別有理由。MIDlet例子擴展了BaicMIDlet類,但兩個類很容易組合成一個。

第五步是縮短你的包名,類名,方法名和數(shù)據(jù)成員名??瓷先ミ@一步顯得很愚蠢,但一個class文件保存了很多字符信息。
縮短他們的名字你會減少clas文件的size。這個辦法節(jié)省的東西不會很多,但當遍及到多個類時他們會增加。包名特別
應該被縮短。因為MIDP應用程序完全是獨立的,你能完全避免包名——不會有機會跟該設備其他類的名字沖突。MIDlet例子
可以從com.j2medeveloper.techtips 包里面移出來。

注意縮短名字不是你手工要做的那些東西,我們可以使用一個名叫“擾亂器”的工具來做。擾亂器的主要目的是
為應用程序“隱藏”代碼,它反編譯程序的時候使程序變成一些幾乎無法閱讀的東西。這個過程的另外一個作用就是減少了程序的size。
那上因為隱藏代碼主要通過重新為方法和數(shù)據(jù)成員命名。這里有個開發(fā)源代碼的擾亂器叫RetroGuard的免費工具來自
http://www.retrologic.com,并且上面還有許多商業(yè)用的包。

最后,關(guān)注一些數(shù)組的初始化。(MIDlet例子沒有做任何數(shù)組初始化,但這是程序很重要的一步)當編譯完以后,一個數(shù)組初始化
代碼像這樣:
int arr[] = { 0, 1, 2, 3 };
實際產(chǎn)生的代碼如下:
  arr[0] = 0;
  arr[1] = 1;
  arr[2] = 2;
  arr[3] = 3;
如果想研究的話,可以使用java2sdk一起發(fā)布的將字節(jié)代碼分解成一個class的javap工具(使用-c參數(shù))。你可能會驚訝和不滿
你所看到的結(jié)果。兩種可選的辦法是(1)把數(shù)據(jù)編碼到一個String里面,運行時解碼到數(shù)組,或(2)將數(shù)據(jù)作為二進制文件保存
到程序包里面并在運行時用class loader的getReourceAsStream方法訪問。

這里說的東西只是一些指導,并且在這里提到的不是每一步都適合每一個J2ME應用程序。然而,他們大部分都可以應用這個MIDlet例子。
MIDlet的優(yōu)化版本如下:
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();
  }
  }
}

到此,關(guān)于“如何優(yōu)化J2ME應用程序”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設公司網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

本文標題:如何優(yōu)化J2ME應用程序-創(chuàng)新互聯(lián)
瀏覽地址:http://www.muchs.cn/article26/dhjocg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App設計、靜態(tài)網(wǎng)站、電子商務品牌網(wǎng)站制作、網(wǎng)站排名、標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設