如果要说J2ME应用程序和J2SE应用程序有什么不同的地方的话,那就是他们各自被限制运行的环境。
很多J2ME系统的主要的瓶颈是存储和运行应用程序的可用内存数量。举例来说,当前许多MIDP设备,他们
限制给应用程序的内存数量就只有50K或更少,离可能要求兆级的基于服务端J2SE环境有段很长的距离。
由于你在开发中会很容易就遭遇这些限制,所以在这篇J2ME技术提示中,你会学到如何让你的应用程序占用最
少的内存。你将用这些技术减少MIDlet占用的空间,MIDlet只是显示一个文本框并且在其中内容被更改
的时候发出声音:
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程序。
注意上面演示的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例子已经是相当小的了。
第二步着眼于应用程序定义的内部类,特别是匿名类。记住每一个类文件都有一定相应的空间开支。甚至最微不足道的
类也需要成本:
public class foo {
// nothing here
}
编译这个类,你可以发现你得到一个占用几乎200字节空间的class文件。一个匿名类一般用途是用来实现事件监听。
MIDlet例子定义了两个listener。一个简单优化就是让MIDlet的主类实现CommandListener和ItemStateListener
两个接口,删除里面的listener代码。记住多个对象可以使用相同的listener。如果需要区别开来,
可以传递参数给commanAction和itemStateChanged方法。
内部类也会通过其他方面膨胀代码,因为编译器必须产生不同的变量和方法来允许一个内部类访问封装类里面的私有信息。
第三步是最大程度使用内置的类。举个例子,在基于CLDC的程序中不要建立你自己的集合类。尽量使用内置的Hashtable
和Vector。设计MIDP应用也是一样。MIDlet例子定义了一个Form子类来创建它的主form,但它还能被很容易地直接创建:
mainForm = new Form( "MainForm" );
mainForm.addCommand( okCommand );
mainForm.setCommandListener( listener );
这里没有对和错的问题,这只是需要考虑的一些简单的东西。
第四步是取消你应用程序的继承关系。你可能已经将代码分解成一个或多个抽象类,这是个被推荐的能提高代码重用
的OOD设计方法。也许会跟你学到的东西有抵触,但去简化继承层次更加说的过去。如果你的抽象类——可能来自其他项目——
只是被继承了一次,那简化继承关系就显得特别有理由。MIDlet例子扩展了BaicMIDlet类,但两个类很容易组合成一个。
第五步是缩短你的包名,类名,方法名和数据成员名。看上去这一步显得很愚蠢,但一个class文件保存了很多字符信息。
缩短他们的名字你会减少clas文件的size。这个办法节省的东西不会很多,但当遍及到多个类时他们会增加。包名特别
应该被缩短。因为MIDP应用程序完全是独立的,你能完全避免包名——不会有机会跟该设备其他类的名字冲突。MIDlet例子
可以从com.j2medeveloper.techtips 包里面移出来。
注意缩短名字不是你手工要做的那些东西,我们可以使用一个名叫“扰乱器”的工具来做。扰乱器的主要目的是
为应用程序“隐藏”代码,它反编译程序的时候使程序变成一些几乎无法阅读的东西。这个过程的另外一个作用就是减少了程序的size。
那上因为隐藏代码主要通过重新为方法和数据成员命名。这里有个开发源代码的扰乱器叫RetroGuard的免费工具来自
http://www.retrologic.com,并且上面还有许多商业用的包。
最后,关注一些数组的初始化。(MIDlet例子没有做任何数组初始化,但这是程序很重要的一步)当编译完以后,一个数组初始化
代码像这样:
int arr[] = { 0, 1, 2, 3 };
实际产生的代码如下:
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
如果想研究的话,可以使用java2sdk一起发布的将字节代码分解成一个class的javap工具(使用-c参数)。你可能会惊讶和不满
你所看到的结果。两种可选的办法是(1)把数据编码到一个String里面,运行时解码到数组,或(2)将数据作为二进制文件保存
到程序包里面并在运行时用class loader的getReourceAsStream方法访问。
这里说的东西只是一些指导,并且在这里提到的不是每一步都适合每一个J2ME应用程序。然而,他们大部分都可以应用这个MIDlet例子。
MIDlet的优化版本如下:
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应用程序性能优化
### J2ME应用程序性能优化的探讨 #### 引言 随着移动互联网的快速发展,Java 2 Micro Edition(简称J2ME)作为一种适用于嵌入式设备和消费性电子产品上的Java平台,为开发者提供了丰富的开发工具和环境。然而,...
**基于Eclipse环境的J2ME应用程序开发** Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、智能家电等。Eclipse作为流行的Java开发集成环境,提供了强大的工具支持,使得...
为了充分优化J2ME应用程序的性能,开发者还需要关注内存使用和应用程序的生命周期管理。MIDlet是J2ME应用程序的基本组成部分,它具有生命周期管理方法,包括startApp()、pauseApp()和destroyApp()方法,用于处理应用...
学习J2ME应用开发,你需要熟悉MIDlet的概念,它是J2ME应用程序的基本单元,运行在MIDP环境中。MIDlets有生命周期,包括初始化、显示、暂停、恢复和终止等状态,开发者需要理解如何管理这些状态来确保应用的正确运行...
MIDP定义了用户界面、网络访问和文件存储等核心功能,而CLDC则提供了运行J2ME应用程序所需的虚拟机环境和基本类库。 在J2ME开发中,你将接触到以下几个关键概念: 1. **MIDlet**:这是J2ME中的应用程序单位,类似...
这些IDE提供了编写、编译、模拟和部署J2ME应用程序的工具。安装后,需要配置J2ME SDK,并创建新的J2ME项目。 3. **基础语法与编程结构** J2ME基于Java语言,因此熟悉Java基础至关重要。包括类、对象、继承、封装、...
由于资源限制,J2ME应用程序的性能优化至关重要。这包括减少内存占用、优化代码结构、合理使用线程以及避免不必要的网络请求等。 综上所述,基于J2ME平台的手机应用程序开发涉及了从基础的J2ME架构理解,到具体的...
5. 调试与优化:学习如何测试和优化J2ME应用程序以提高性能。 6. 发布与分发:了解如何打包和签名J2ME应用,以便在不同设备上安装和运行。 通过深入学习和实践这些知识点,开发者能够掌握J2ME技术并创建自己的移动...
6. **性能优化**:提供优化J2ME应用程序的技巧,如代码精简、内存管理以及处理设备限制的方法。 7. **实例分析**:通过具体的示例项目,演示如何从零开始构建一个完整的J2ME应用,包括UI设计、逻辑实现和错误处理。...
**J2ME官方文档——WTK2.5.1...总结,J2ME官方文档WTK2.5.1不仅提供了全面的API参考,还涵盖了开发、测试和优化J2ME应用程序的整个过程。通过深入理解和熟练运用这些文档,开发者可以创建出高效、适应性强的移动应用。
CLDC与MIDP一起构成了J2ME应用程序的基础。 3. **KJava**:这是早期诺基亚手机上的一种J2ME实现,它允许开发者使用Java语言编写应用程序,然后在手机上运行。 4. **WTK (Wireless Toolkit)**:这是Sun ...
在开发J2ME应用时,我们需要编写配置文件如`midlet.jad`和`midlet.jar`,它们分别用于描述应用程序的元数据和包含编译后的代码。 2. **开发环境与工具** 常用的J2ME开发工具有NetBeans、Eclipse和JCreator等,它们...
在J2ME(Java 2 Micro Edition)开发中,代码优化和内存优化是至关重要的环节,因为资源有限的移动设备需要高效且节省...通过阅读压缩包中的文档和教程,开发者可以深入了解这些技术,提升J2ME应用的性能和用户体验。
这个压缩包包含的是一个关于J2ME手机应用项目开发实践的源代码集合,对于学习和理解J2ME应用程序的开发流程和技巧具有一定的参考价值。 在J2ME开发中,你需要了解以下核心概念: 1. **KVM(Java Virtual Machine ...
2. **KVM(Java虚拟机)**:J2ME设备通常使用的是简化版的Java虚拟机,即K Virtual Machine,它负责解释和执行J2ME应用程序。 3. **CLDC(Connected Limited Device Configuration)**:针对内存和处理能力有限的...
**J2ME开发详解-工具篇** 在移动设备和嵌入式系统开发领域,Java 2 Micro Edition(J2ME)扮演着...这两款工具都提供了强大的功能,有助于开发者快速构建、测试和优化J2ME应用程序,适应多样化和不断发展的移动市场。
J4ME 是一个 J2ME 应用程序开发库,目标是快速构建专业的 J2ME 应用程序。它提供了一个 UI 框架、日志框架、RMS 框架、蓝牙 GPS 框架等多个功能。 3. MWT(Micro Window Toolkit) MWT 是一个用于开发 J2ME 用户...
PNG(Portable Network Graphics)是一种无损压缩的位图...这对于优化J2ME应用的性能、加快加载速度和节省设备存储空间具有重要意义。开发者可以利用这个工具提升其J2ME应用的用户体验,特别是在资源有限的移动设备上。