溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何優(yōu)化J2ME應(yīng)用程序

發(fā)布時間:2022-01-10 15:27:27 來源:億速云 閱讀:136 作者:iii 欄目:編程語言

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

如果要說j2me應(yīng)用程序和j2se應(yīng)用程序有什么不同的地方的話,那就是他們各自被限制運行的環(huán)境。
很多J2ME系統(tǒng)的主要的瓶頸是存儲和運行應(yīng)用程序的可用內(nèi)存數(shù)量。舉例來說,當(dāng)前許多MIDP設(shè)備,他們
限制給應(yīng)用程序的內(nèi)存數(shù)量就只有50K或更少,離可能要求兆級的基于服務(wù)端J2SE環(huán)境有段很長的距離。
由于你在開發(fā)中會很容易就遭遇這些限制,所以在這篇J2ME技術(shù)提示中,你會學(xué)到如何讓你的應(yīng)用程序占用最
少的內(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的第一步是通過減少應(yīng)用程序功能來移除一些不必要的類。你的應(yīng)用程序的每個特性都是真的必要的嗎?
你的用戶能否忍受沒有鈴聲和哨聲?讓我們來建立最小版本的應(yīng)用程序。注意到MIDlet例子已經(jīng)是相當(dāng)小的了。

第二步著眼于應(yīng)用程序定義的內(nèi)部類,特別是匿名類。記住每一個類文件都有一定相應(yīng)的空間開支。甚至最微不足道的
類也需要成本:
  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。設(shè)計MIDP應(yīng)用也是一樣。MIDlet例子定義了一個Form子類來創(chuàng)建它的主form,但它還能被很容易地直接創(chuàng)建:
  mainForm = new Form( "MainForm" );
  mainForm.addCommand( okCommand );
  mainForm.setCommandListener( listener );
這里沒有對和錯的問題,這只是需要考慮的一些簡單的東西。

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

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

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

最后,關(guān)注一些數(shù)組的初始化。(MIDlet例子沒有做任何數(shù)組初始化,但這是程序很重要的一步)當(dāng)編譯完以后,一個數(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ù)作為二進(jìn)制文件保存
到程序包里面并在運行時用class loader的getReourceAsStream方法訪問。

這里說的東西只是一些指導(dǎo),并且在這里提到的不是每一步都適合每一個J2ME應(yīng)用程序。然而,他們大部分都可以應(yīng)用這個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應(yīng)用程序”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI