<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>j2me技术的学习与实践者</title>
    <description>正在进行J2ME的学习和实践，个人的第一个作品：手机理财，下载地址是 http://www.kingdart.cn/downloads/jaccount.rar</description>
    <link>http://iwinyeah.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>1.0.8新版预览</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/223933" style="color:red;">http://iwinyeah.javaeye.com/blog/223933</a>&nbsp;
          发表时间: 2008年08月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          手机理财1.0.8版本准备增加了以下功能：<br /><br />1、金额加上分隔符；<br />2、不同类型交易有不同的颜色圆点标示（红色：收入，绿色：支出，未核定的交易为空心圆，未核定非收支交易黑色空心圆，已核定的无标示）<br />3、针对全键盘手机数字键反而不好用的问题，准备再定义实现同样功能的字母键，这样定义：Q=4 首页,W=2 上页,E=8 下页,R=6 尾页,T=3 编辑,Y=5 选用,U=1 增加,I=0 删除,O=* 范围,P=# 取消范围<br />4、交易上移或下移的时候，焦点行也相应跟上变化，这就解决了连续上移的问题了。<br />5、在帐本列表中加上按日期重新排序的功能。
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/223933#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 04 Aug 2008 17:18:09 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/223933</link>
        <guid>http://iwinyeah.javaeye.com/blog/223933</guid>
      </item>
      <item>
        <title>能否考虑使用asp实现服务器与手机通讯？</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/222934" style="color:red;">http://iwinyeah.javaeye.com/blog/222934</a>&nbsp;
          发表时间: 2008年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          个人有一个虚拟网站www.kingdart.cn，支持asp+access,手机理财JAccount的备份只能用在支持JSR75的手机上，一想到这个就很不爽。<br />能不能使用asp+access和实现备份和恢复的功能呢？手机与服务器的通讯通过asp来实现，数据保存在access中，通讯协议http或socket都可以考虑呢！<br />没研究过asp，不知道是否可行！
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/222934#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 01 Aug 2008 18:39:19 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/222934</link>
        <guid>http://iwinyeah.javaeye.com/blog/222934</guid>
      </item>
      <item>
        <title>OpenbaseMovil:Eclipse中如何开始呢？</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/216430" style="color:red;">http://iwinyeah.javaeye.com/blog/216430</a>&nbsp;
          发表时间: 2008年07月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一直只是远距离观察学习OpenbaseMovil的代码和文档，没有真正运行过其中的代码。<br />昨天，准备运行它自带的例程：PasswordKeeper竟然不成功。<br /><br />它的QuickStartGuide是指导使用Ant来构建的，而我居然不会使用ant,只会使用Eclipse的集成环境（极度惭愧中...），于是我新建了一个名为PasswordKeeper的Midlet suit,并增加了main包和res文件夹，在java构建路径中为它加入了openbaseMovil的库，然后导入PasswordKeeper的文件，调整了包名后，有两个错误：<br />MainColtroller.java中的Store.safeDeleteRecordStore( "sys_devinfo" )和<br />PasswordWord.java中的Store.smartShutdown()都出现了“没有为类型Store定义方法...”的错误，而我查看import bm.storage.Store中这两个静态方法都是存在的，不知道是原因？<br /><br />谁可以帮助一下呢？
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/216430#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Jul 2008 06:37:48 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/216430</link>
        <guid>http://iwinyeah.javaeye.com/blog/216430</guid>
      </item>
      <item>
        <title>试翻译Openbasemovil-core 2.0 Developers Guide</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/215287" style="color:red;">http://iwinyeah.javaeye.com/blog/215287</a>&nbsp;
          发表时间: 2008年07月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          为了对openbasemovil-core库有一个全面的认识，我翻译了它的开发者指南，翻译得不算太好，但都是我的个人理解，希望大家指正。<br /><br /><pre name="code" class="java">
OpenBase Movil Core 开发指南
---------------------------------------------------------------
版本号: 1.0
作者: Narciso Cerezo
翻译: iwinyeah

索引

1. 序言 ..................................................... 3 
2. 核心包简介 ............................................... 5 
2.1 事件管理 ................................................ 5 
2.1.1 进度事件 .............................................. 5 
2.1.2 语言变化事件 .......................................... 5 
2.1.3 后台任务 .............................................. 5 
2.1.4 登记事件监听器 ........................................ 6 
2.1.5 创造新事件 ............................................ 6 
2.2 任务管理 ................................................ 7 
2.3 文件系统 ................................................ 7 
2.4 序列化 .................................................. 8 
2.5 日志 .................................................... 9 
2.6 数学库 ................................................. 10 
2.6.1 为某一特定区域设置浮点数 ............................. 10 
2.7 MVC模式 ................................................ 11 
2.7.1 视图 ................................................. 11 
2.7.1.1 行动 ............................................... 11 
2.7.1.2 抽象视图 ........................................... 11 
2.7.2 控制器 ............................................... 12 
2.7.3 帮助 ................................................. 13 
2.8 国际化 ................................................. 14 
2.9 压缩 ................................................... 14 
2.10 应用程序框架 .......................................... 15 
2.9.1 应程序管理器 ......................................... 15 
2.11 其他工具 .............................................. 15 
2.11.1 校验码 .............................................. 15 
2.10.2 加密 ................................................ 15 
2.11.3 信息摘要算法(MD5) ................................... 15 
2.11.4 设备扩展信息 ........................................ 16 
2.11.5 属性文件 ............................................ 16 
2.11.6 简单的缓存系统 ...................................... 16 
2.11.7 本地化格式 .......................................... 17 
2.11.8 工具 ................................................ 18 
2.11.8.1 安全的内存申请 .................................... 18 
2.11.8.2 数组式Vector ...................................... 18 
2.11.8.3 对象相等性 ........................................ 18 
2.11.8.4 重复字符 .......................................... 18 
2.11.8.5 幂(乘方)计算 ...................................... 18 
2.11.8.6 字符串分析 ........................................ 18 
2.11.8.7 自动分行 .......................................... 18 
3.l 版权 ................................................... 19 
3.1 保证 ................................................... 19

1. 序言

Openbasemovil-core库，是Openbasemovil中最基本的库，所有其他的openbasemovil库，从数据库引擎到脚本引擎，都依赖于这个库。 
它为其它类提供一些公共的服务，包括很多没有在JavaME中实现的类。

• 事件管理
这是一个集中式事件管理器，它可以处理不同类型的事件，该管理器允许多个监听器监听全局性事件或者特定类型的事件(通过自定义事件或者事件过滤)。

• 任务管理
控制所有活动的线程，它们之间的交互，终止等。

• 文件系统
它使用记录存储系统(RMS)来模拟实现文件系统，FileOutputStream和RandomAccessFileInputStream。

• 序列化
该串行接口是替换在JavaMe中没有实现的java.io.serializable,即允许任何类型的对象从流中序列化和反序列化。它也包含复杂对象序列化/反序列化，包括复杂的
Tree类对象，任何的混合型Hashtables, Vector, 和其他类对象。

• 日志
一个基本的日志应用程序接口，与Jakarta公共日志软件包类似，具有可插拔的接口，可用于调试和生产环境。

• 数学
包含浮点数计算类，替换了在JavaME CLDC 1.0 中未实现的浮点/双精度浮点类。

• MVC模式
包含基本的一个模型-视图-控制器系统，可处理新线程中的进度命令、高级的类Action类，集成Help管理等。

• 国际化
通过使用资源文件，让您的应用程序支持多种语言。语言是自动侦测的，但可以动态手动改变。它也具有可插拔的机构，这样你就可以使用任何贮存类型的资源而不局限于属性文件了。它同时处理日期、数字、货币的格式等。

• 压缩
一个改编的较短版本的jzlib库，改编自zlib。

• 其他工具： 
* CRC校验(使用Adler32算法)。
* 对称加密与Blowfish(http://www.bouncycastle.org)。
* 信息摘要算法MD5(http://www.bouncycastle.org)。
* 设备扩展信息
* 支持读和写的属性文件。
* 简单的缓存系统，使用LRU抛弃策略。

2. Openbasemovil-core库简述

2.1 事件管理
在每一个应用程序中，需要进行长时间的过程中必须始终通知用户有关任务的进展情况。只有这样，使用者才能肯定应用程序仍然在良好的状态下运行。

它最初只是一个事件管理系统的驱动器。它联结发出进度事件的非用户界面库和终端应用程序，后者监听事件并向使用者显示当前进度。

但现在它向前演化了，还充当了在生产者和监听器之间传输各种类型事件的枢纽。

其中关键的类bm.core.event.event，即代表了事件本身，但也有一些静态方法用于控制监听器的登记、事件的调度等。

另一个关键的类bm.core.event.eventlistener，如果类要具有监听事件的能力，它就是一个必须实现的接口。

core库已经为一些情况预定义了某些事件类型以便于控制，并且它还有一些扩展了其属性的子类。

2.1.1 进度事件
进度事件是一个特殊类型的事件，是事件的子类：bm.core.event.progressevent。进度事件类有一些属性用于表达任务的进展情况，例如类型(定步长|不定步长)、最大值、当前值、标签等。

进度事件的ID为1。

例子：
	// 创建一个事件并指定其事件源
	final ProgressEvent event = new ProgressEvent( this );
	event.setAnimate( true ); // 事件没有固定的步长
	event.setTitle( "Some task" );
	event.setMessage( "Please, wait..." );
	event.dispatch(); // 调度该事件

2.1.2 语言更改事件
语言和资源由bm.core.ResourceManager负责管理。当使用者改变语言时，监听器将收到该事件，这样它们就可以丢弃原先缓存的语言信息并装入新的资源了。

语言改变事件没有特定的子类，它被的ID为2。

更多关于国际化和资源管理的资料，可以参考第2.8节。

2.1.3 后台任务
在openbasemovil库中，许多类会产生进度事件，它们将会依次更新进度显示视图，如果你执行的是一个后台任务，这显然不是一种合适的行为。

这时你可以创建一个ControlledTask的子类，并将它设为后台任务，这样，事件管理器将筛选出进度事件，后台事件将被丢弃。

更多关于ControlledTask的资料，请参考第2.2节。

例子：
	// 创建一个控制任务
	public class MyBackgroundTask extends ControlledTask
	{
		public MyBackgroundTask()
		{
			super( "MyBackgroundTask", true ); // 任务名称，后台任务标志
		}
	}

2.1.4 登记监听器以监听事件
你只需要实现bm.core.event.EventListener接口就可以监听任何类型的事件。

该接口只定义了一个方法：void handleEvent(Event event);

同时可以有多个监听器监听同一类型的事件，你也可以将你的监听器登记为全局监听器(监听全部的事件而无论事件是什么类型)。

监听器保存在一个有序的列表中(以Vector实现)，并且按它们登记的先后顺序来调度。

事件类可能被某一监听器标志为消灭状态，一旦发生这种情况，事件调度链将被打断，后续监听器将不会监听到此事件。

消灭标志也会在调度完成后被自动置位，这样事件对象就可以被重新使用了。

例子：
	public class MyListener implements EventListener
	{
		public MyListener()
		{
			// 你可以在任何位置登记监听器
			// 放在构建函数中只是为了方便举例

			// 监听语言改变事件
			Event.register( this, Event.LANGUAGE_CHANGE );
		}
		public void handleEvent( Event event )
		{
			// 当事件发生时作出响应
		}
		public void someMethod()
		}
	}

2.1.5 创建新事件
当然，为适应实际需要，你可以在事件系统中使用任何类型的事件。

如果你的事件不需要其他属性，你可以为事件类指定一个自定义事件类型ID，直接使用事件类，如果你需要其它属性，你可以创建事件的子类。

但无论如何，你必须自定义事件类型ID，该ID应大于10000，低于10000的值保留为这个类以用OpenBaseMovil的其他类使用。

事件类型ID没有特别的登记方法，当监听器登记一个未存在的事件类型时，该类型将会被自动创建。

2.2 任务管理
我们建议你总是在新线程里处理用户交互动作(命令)，这样当命令被处理时，设备能保持对用户动作的快速反应。

线程还在很多其他情形下非常有用，例如需要在后台做处理工作而前台保持与用户的交互作用时。

如果你不仔细规划你的线程，将可能导致线程死锁，或造成协同问题。

并且当你需要退出应用时，你需要一些方法通知所有运作中的线程停止以便完全退出。

为了处理这种情况，以及在后台处理进度事件，我们创建了ControlledTask类。

例子：
	// 新建一个ControlledTask对象
	public class MyControlledTask extends ControlledTask
	{
		public MyControlledTask()
		{
			super( "MyControlledTask", false ); // 新建一个前台线程
		}
		protected void task()
		{
			// 一个任务可以运行后立即终目，也可以运行直到收到终止通知
			// 当cancel属性为真时，任务被通知终止
			// 它必须自行终止
			while( !cancel )
			{
				// 执行任务
			}
		}
		protected void die()
		{
			// 在CLDC 1.0中，当线程正常地完成后，这个方法将在被调用
			// 这是一个最好的调用方式；
			// 不正常的调用方式，譬如任务在读取输入流时死锁，
			// 关闭输入流将解除死锁并终止线程。
		}
	}

例子：
	// 取消所有任务
	ControlledTask.cancelAll();

这个方法在CLDC 1.0和CLDC 1.1有不同实现，因为第一个没有interrupt()方法。任务正常完成后如果没有终止，这个方法将在通知终止后被调用。

2.3 文件系统
文件系统包含有两个备受称赞的类，实现了一个与FileOutputStream类似的输出流，它基于记录贮存系统(RMS)而不是正常的文件，一个有随机读取能力的输入流(读取的目标“文件”是与其配对使用的上述输出流)。

这个包很多情况下是十分有用的，它在基于记录贮存系统(RSM)对真实文件进行了模拟，无须特别的权限，无须实现文件API，而且它使你可以在使用很小的内存就可以无缝地贮存比较大的文件。

输出流的名称为bm.core.fs.SequentialFileOutputStream，这个类使用记录贮存系统(RSM)并将要构成文件的数据分成小块，每一小块在RMS中映射为一个记录。默认地，它每小块的长度为5K，但你可以在构建时指定块的大小。

输入流的名称为bm.core.fs.RandomAccessInputStream，它是一个简单的输入流，却是从与它配对使用的输出流写入的RMS中读取记录，特别的是它具有seek()方法，具有移动流输入位置的能力。

例子：
	// 读写文件
	SequentialFileOutputStream os = null;
	RandomAccessInputStream is = null;
	try
	{
		// 新建一个文件并写入1000字节
		os = new SequentialFileOutputStream( "myfile" );
		for( int i = 0; i &lt; 1000; i++ )
		{
			os.write( 1 );
		}
		os.close();
		// 打开文件
		is = new RandomAccessInputStream( "myfile" );
		// 跳过前500字节
		is.seek( 500 );
		// 读取后500字节
		for( int i = 0; i &lt; 500; i++ )
		{
			is.read();
		}
		is.close();
	}
	catch( Exception e )
	{
		e.printStackTrace();
	}
	finally
	{
		if( os != null ) try{ os.close() } catch( Exception e ){}
		if( is != null ) try{ is.close() } catch( Exception e ){}
	}

2.4 串行化
串化化是一个在JavaME中缺少的关键概念，而它在OpenBaseMovil框架在被广泛使用。

与JavaSE中原来的串行化接口不同，它不只是建造器：它有两个方法，serialize和deserialize，理由很简单，在JavaME中没有反射或者其它什么机制可以使一个类知道什么类已经装入。

使用bm.core.io.Serializable接口，对象自定义了一个通过输入输出流读写它们自身的方法。

而通过bm.core.io.Serializable接口，对象定义了它们如何将自己的特性写入或从流中恢复。并且其他对象可以统一的方法处理他们，例如使用库所提供的bm.core.io.SerializerOutputStream和bm.core.io.SerializerInputStream。

在bm.core.io.Serializable接口中还定义了getName()方法，当使用serializer流的writeObject/readObject方法实现对象serialized/deserialized时，它可返回该类的名字。这在使用混淆器时的一个安全的机制，如何不使用它将会无法读回之前序列化的一个对象。

例子：

	// 创建一个序列化对象
	public class MySerializableClass implements Serializable
	{
		private String string1;
		private int int1;
		private Short short1;
		private byte[] data;

		public void getName()
		{
			return "MySerializableClass";
		}

		public void serialize( final SerializerOutputStream out ) throws SerializationException
		{
			out.writeByte( (byte) 1 ); // 建议包含一个版本号
			out.writeString( string1 );
			out.writeString( int1 );
			out.writeShort( short1 );
			out.writeBlob( data );
		}

		public void deserialize( final SerializerInputStream in )
		{
			in.readByte(); // 忽略版本号.如果版本号不同,你也许要处理一下
			string1 = in.readString();
			int1 = in.readInt();
			short1 = in.readNullableShort();
			data = in.readBlob();
		}
	}

例子:
	// 使用序列流serializer streams
	// 序列化工厂的初始化应的应用启动时完成
	// We should do MySerializableClass.class, but that does not work on CLDC 1.0
	SerializerFactory.register( "MySerializableCass", new MySerializableCass().getClass() );
	final Vector list = new Vector( 3 );
	final Hashtable map = new Hashtable( 1 );
	list.addElement( new MySerializableClass() );
	list.addElement( new MySerializableClass() );
	list.addElement( new MySerializableClass() );
	map.put( "key", list );

	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	SerializerOutputStream out = new SerializerOutputStream( baos );
	out.writeObject( list );
	out.close();

	ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
	SerializerInputStream in = new SerializerInputStream( bais );
	list = in.readObject();
	in.close();

serializer流可以读或写对象的nullable或者非nullable的树，无论该树以任何层次以任何形式巢化，而唯一的限制是该树的全部元素必须是一种原始类型(包括字节阵列)，Vectors, Hastables 或序列化对象.

2.5 日志
该日志系统以一个优雅而有效率的方式将日志消息到应用到您的代码中。
它有一个模仿Jakarta通用日志包，其中的差异要通过字符串而不是一个类来创建日志,这是由于CLDC1.0缺少了NoClassDefFoundException而造成的.

日志接口让您可以在编译时插入不同的实现，因此，您可以通过控制台显示日志信息，将他们写入一个文件或者干脆忽略它们。 
通过这种方式,您可以为您的应用建立不同的版本，典型地,你可以将它分开成开发版正式版.

例子:
	// 使用日志系统
	import bm.core.log.*;
	public class MyClass
	{
		private static final Log log = LogFactory.getLog( "MyClass" );

		public void foo()
		{
			log.info( "foo method" );
			log.debug( "this is a debug message" );
		}
	}

2.6 数学
虽然cldc1.1附带的浮点支持，然而还有很多使用cldc1.0的手机，它们不支持浮动类型也没有双精度类型。 

bm.core.math.fixedpoint的创建就是为了在使用cldc1.0的手机提供浮点数支持. 它也有一些其他公用方法,例如根据区域设置显示适当金额字符串及其单位。

Fixedpoint类内部使用了一个长整数保存数值，并使用短整型指示其精度。因此，value * 10precision = floating point value 浮点值。

您要时刻记住,与Java语言中的其他的数值对象一样,Fixedpoint是不可变对象。

当然,Fixedpoint也是可序列化的.

例子:

	FixedPoint fp = FixedPoint.ONE; // FixedPoint.ONE 是一个有用的常量用于表示浮点数 1.0
	FixedPoint fp1 = fp.mult( FixedPoint.ZERO ); // FixedPoint.ZERO 用于表示浮点数 0.0
	System.out.println( fp1.toString() ); // 将打印出 0
	FixedPoint fp10 = FixedPoint.parse( "10" );
	FixedPoint fp10_325 = FixedPoint.parse( "10.325", '.' );
	// 以下若使用西班牙区域将打印10,33€ ,而使用美国区域将打印$10.33
	System.out.println( fp10_325.toMoneyString() );
	System.out.println( fp10_325.div( fp10 ).toString() ); // 将打印: 1.0325
	System.out.println( fp10_325.toString() ); // 将打印: 10.325 因为FixedPoints是不可变的

2.6.1 将Fixedpoint配置为某一特定地区
与本核心库一起提供的西班牙语（西班牙）和英语（美国）资源档案已经界定了Fixedpoint的行为。以下配置是用来规定Fixedpoints是如何实现浮点数和字符串互换的.
	# A single character to separate integer from decimals
	fixedPoint.decimalSeparator
	# A grouping separator to use for toMoneyString
	fixedPoint.groupingSeparator
	# The money symbol or character
	fixedPoint.moneySimbol
	# If the symbol comes before or after the quantity
	fixedPoint.moneySimbolAfter

2.7 MVC 模型
您可以使用核心库中的MVC模型来建造您的应用.

该库提供了一个抽象控制器,它处理应用发出的(响应玩家动作)的命令,为该命令创建一个新线程来处理它.

其中,它还会拦截一些事件,例如帮助请求.

它还提供了一个抽象的视图,该视图有一些有用的方法,通过扩展它您可以从中得到不少的益处.

控制器和视图都有较少的接口， 因此你可以总是使用接口而不是它们的子类，但是我们不推荐这样使用，除非在很特殊的情况下。

2.7.1 视图
与将应用的视图作为Canvas、Form或其它MIDP类的子类相反，视图接口允许你从真正实现中抽象出来，这样您就可以无缝地改变实现。

一个视图必须有一个id，一个中应用中唯一的数值的标识符。这个Id使控制器里可以很快地找到特定的视图，加快switch语句中的速度。

视图可以拥有一个呼叫者视图，这样视图就可以很简单地切换回呼叫者视图。

当你从视图中返回呼叫者视图时(使用goBack 方法)，那些release()方法将被调用，这样它就可以释放它可能持有任何资源。请注意，视图流向前时release()方法不会被调用，只有向后返回时才会被调用。

视图也可能有附件。这些附件可能是任何类型的对象，并且可以通过视图流向后取得。这个机制可用于保持一组页面会话的状态。例如，你从客户列表中选择了一个客户，然后你转到客户明细信息页，将该客户与该页关联起来，在客户明细信息页面，你有一些相对于该客户的动作，如呼叫该客户、为该客户做一个订单等，所有后续的动作都会参考该页关联的客户。

2.7.1.1 动作
行动是一种超越传统MIDP命令的先进的概念，但与之非常类似。事实上，行动会被翻译成命令。

行动可以宣告，添加视图，并且可以启用或停用。您可以添加一个未启用的行动，稍后再激活它，和它相关的命令也会将被添加到的视图中。

在openbasemovil-util库中，行动在视图设计中的一个有用的元素。通过这种方式，可将视图宣告在一个XML文件中，并以一种简单的方式来定义它们的功能。

2.7.1.2 抽象视图
这个类实现了接口View中所有的常用方法，从而成为一个可为特定视图提供完美服务的超类。但它也有一些静态的方法为整个openbasemovil库和其它库使用，所以你应该尊重它所实现的模型，即使您不创建它的子类。

它的所有实现是行动和附件所必需的。

但它也执行其他非常重要的任务：

• 保持目前显示的视图
由于我们所使用的视图，我们不能依靠Display对象从MIDP的获得目前显示的视图。因此，它使用一个静态成员，当每次调用一个view的show()方法时，该静态变量将被更新。

如果您的视图不是抽象视图的子类，你在show()方法中就需要调用setcurrent()方法了。

• 控制闲置时间的应用
每当当前视图中发生变化，或者用户执行了一些动作，它即时将一个静态计数器置0。这样，您就可以检查应用与玩家有多久没有互动了，这是非常有用的，例如，锁定应用，并要求玩家输入一个PIN。

• 当视图被释放时通知控制器
抽象视图的子类可以而且应该实现释放方法release()以释放资源。但对于一些普遍而复杂视图，例如openbasemovil-util库中的一些实现，有时不能完成释放这些资源。这些释放操作就下放到控制器的回调方法onRelase()来完成。抽象视图在其release()方法中默认地调用其视图控制器的onRelase()，它还会卸下所有的附件(对象)。

• 处理某些型号手机的一些显示错误
不同型号的手机之间的javame实现有时是有巨大的分别的。目前最好的javame实现是索爱的jp7和jp8平台，其次是诺基亚。甚至在同一平台下不同固件的机器之间也有不同。诺基亚的虚拟机在任务管理方面是最强大的，但随后发布的索爱jp7则更快但存在一些错误。

2.7.2 控制器
控制器是MVC框架的其中一个重要的部分。控制器从当前视图中得到原始的行动事件，执行一些行动并且也许显示另一个视图。

控制器应该封装决定显示哪个视图的代码，并充当将模型取得数据供给视图的管道。

控制器仅有两个方法：
	/**
	* Handle an event.
	*
	* @param event event to handle
	*/
	void handle( ControllerEvent event );
	/**
	* When a view is released.
	* @param view view released
	*/
	void onRelease( View view );

handle()方法是最重要的，它接收的ControllerEvent具有执行相应任务全部需要的信息。

目前ControllerEvent并不是Event的子类，但在2.0 版本将会改变。

ControllerEvent有一个事件码，它是一个整数，指示玩家选择的是哪个行动；事件源指示产生行动的源视图；一个索引用于在源视图是一个列表时指示玩家的选择。

它也为全局性的行动定义了一些具体的事件码。这些事件码被保留：

	public static final int EXIT = 10000;
	/**
	* Standard event for help.
	*/
	public static final int HELP = 10001;
	/**
	* Standard event for back.
	*/
	public static final int BACK = 10002;
	/**
	* Standard event for accept.
	*/
	public static final int ACCEPT = 10003;
	/**
	* Standard event for cancel.
	*/
	public static final int CANCEL = 10004;
	/**
	* Standard event for stop.
	*/
	public static final int STOP = 10005;
	/**
	* Standard event for home.
	*/
	public static final int HOME = 10006;
	/**
	* Standard event for list item selection on list views.
	*/
	public static final int LIST_ITEM = 10007;

如你所见，它们非常类似于MIDP中的命令类，但是也增加了一些功能。

其中的onRelease()方法，已经在前面有所提及，将会被视图回调以释放其资源。

2.7.3 帮助
bm.core.HelpAssisted接口，由视图使用，用于指示有上下文帮助可以使用。

你可以使用这个标记自动给视图添加一个帮助行动。

抽象控制器AbstractController拦截帮助事件ControllerEvents，如果视图实现了HelpAssisted，它将为视图查找帮助文本并显示。

为查找并且显示帮助文本，抽象控制器AbstractController(通过ControllerTask的子类ControlledTask)将会使用HelpView类。

HelpView只是一个文本显示视图，你甚至可以为了全屏显示一份文本的目的而使用它。但它具有为一个规定了HelpAssisted项查找帮助的能力。

为了做到这一点，它使用了资源供给器ResourceProvider。这个接口允许HelpView使用一个给定的ID请求帮助而无须关心如何得到该信息。

默认地，它使用帮助资源供给器ResourceHelpProvider。帮助资源供给器ResourceHelpProvider将使用资源管理器ResourceManager尝试依次查找适于当前的语言的(你打包在你的jar文件内的一些文件)的资源。 例如，一个帮助的项目返回的帮助Id为"MainView"，目前默认的语言是en_US，那它将查找资源文件"MainView.en_US.txt", 如果不存在它将尝试"MainView.en.txt"。

通过使用HelpProvider接口，你可以创建你的帮助供给器。OpenBaseMovil商业应用通常使用索引或者数据库表实现帮助。这样就可以创建更小的jar文件，并且可以动态地更新帮助而无须重新安装应用了。

2.8 国际化
虽然已有专门用于国际化的JSR，但目前支持这个JSR的设备仍然很少。如果您想要在更广泛的设备上支持国际化，你就不能依靠他们。

这就是我们建立国际化的框架的原因，该框由其中的资源管理器ResourceManager类和资源供给器ResourceProviders类组成。

资源管理器ResourceManager侦测手机所使用的语言，并允许您手动设定所使用的语言。如果你这样做，ResourceManager通知核心类，譬如FixedPoint或HelpView，并触发LANGUAGE_CHANGE事件，这使任何在侦听该事件的对象得到语言变化的通知。

资源管理器ResourceManager基本上是通过使用资源关键字调用getResource()方法。ResourceManager会要求配置好的资源供给器ResourceProviders以当前的区域设置返回指定关键字的资源。如果关键字没有找到，那么将返回关键字。这消除了NPE?，使您清楚知道您的应用丢失了一些资源。

资源供给器ResourceProviders是可插拔的组件，它可以添加到ResourceManager中，他们实际的从各种存储系统中读取资源的类。

默认地，ResourceManager会自动配置属性供给器PropertyResourceProvider，它们将会使用前述帮助机制，在打包在JAR文件中的资源组中查找适当的属性。

BaseMovil的商业应用通常会使用索引来替代，因为他们不必将资源打包在jar文件中并且可以进行重新而无须再重新安装该应用程序。

2.9 压缩
bm.core.zlib包取自Jzlib项目，只是略有改动，以便尽量减少压缩算法中的内存消耗。

该库通过ZInputStream和ZOutputStream类使用，信息的解压和压缩被隐藏在流中，就样应用就可以即时透明地使用该库。

例子：使用ZInputStream、ZOutputStream
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	// 其他层次通常会抛出OutOfMemoryError
	ZOutputStream zos = new ZOutputStream( baos, Zstream.Z_BEST_SPEED );
	zos.write( 1 );
	zos.flush();
	zos.close();
	ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
	ZInputStream zis = new ZInputStream( bais );
	int c = zis.read();
	zis.close();

2.10 应用框架
本库的被设计为不仅用于JavaME CLDC，而且也可用于其他平台。应用框架增加了用来隐藏的平台底层细节的层。

应用Application对象ApplicationManager，CommandFactory和global timer中的一个接入点：

• 对于具体的实现来说，ApplicationManager是一个它提供系统访问的接口。

• CommandFactory提供访问应用程序命令的接入点。这是非常有用的：通过它所有视图可循环再用命令对象，这样您就可以创建一个单一标准的命令实例或者应用程序所用的其它命令。

• 全局计时器global timer提供一个单一的计时器，以调度应用的TimerTasks。

2.10.1 应用管理器 ApplicationManager
openbasemovil-util库提供了一个MIDP的ApplicationManager的实现。

2.11 其它工具

2.11.1 CRC 校验
Adler32类是用于执行快速的CRC计算，以确保写入和读出的数据是一致的。

2.11.2 Encryption 加密
加密库是采用了Blowfish算法，源自The Legion of the Bouncy Castle。

例子：使用Blowfish算法加密和解密
	// 加密一个字符串
	Blowfish cipher = new Blowfish();
	cipher.init( true, "MyPassword".getBytes() );
	final byte[] encrypted = cipher.encrypt( "Text to chiper" ); // 默认字符串是UTF-8格式的
	// 加密字节数组
	final byte[] source = new byte[10];
	for( int i = 0; i &lt; 10; i++ )
	{
		source[i] = (byte) i;
	}
	final byte[] encrypted2 = cipher.encrypt( source );
	// 解密字符串
	Blowfish decipher = new Blowfish();
	decipher.init( false, "MyPassword".getBytes() );
	final String text = decipher.decryptString( encrypted );
	// 解密字节数组
	final byte[] block = decipher.decrypt( encrypted2 );

2.11.3 信息摘要
信息摘要(安全散列secure hash)采用了MD5算法，源自The Legion of the Bouncy Castle。

例子：为安全散列使用MD5
	// 将密码进行摘要入安全散列
	MD5Digest md5 = new MD5Digest();
	final byte[] data = password.getBytes();
	md5.update( data, 0, data.length );
	// 字节数组用于保存摘要
	final byte[] digest = new byte[16];
	md5.doFinal( digest, 0 );
	// 随后你就可以将玩家的输入摘要与之前摘要出的安全散列进行对比

2.11.4 设备扩展信息
DeviceInfo类提供正在运行应用设备的有用信息。

部分的代码来自TastePhone项目，主要是评估设备速度部分的代码。

DeviceInfo类检查一些非常普通的缺陷是否存在于正在运行的设备中，并且直接提供设备的品牌、模块、操作系统等等。

这些信息是从各种各样的来源中获得的，部分来源于系统属性、部分来源于User-Agent头部信息、部分由内置Web浏览器送出。User-Agent头部信息只在应用通过OTA方式安装并应用一个服务，将头部信息置入JAD文件中的User-Agent属性来得到。

2.11.5 属性文件支持
属性Properties在JavaSE中是非常有名的类，它是Hashtable的子类，其中的关键字和值都是字符串，并且可以众所周知的方式写入或从流中读出。

但令人遗憾，JavaME没有属性类，因此我们理解并且以JavaSE相同的形式实现了这个类。

2.11.6 简易的缓存系统
应用能在很多情况下受益于一个高速缓存系统以提高重复存取的速度。SimpleCache类以LRU方式简单而快速地完成高速缓存操作。

例子：使用SimpleCache提高速度
	public class ItsHardToReadMyItems
	{
		private SimpleCache cache = new SimpleCache( 2 ); // 最多缓存两项
		public Object get( final Object key )
		{
			Object object = cache.get( key );
			if( object == null )
			{
				object = ... ; // 将会花费较长的时间
				cache.add( key, object ); // 将它加入缓存备用
			}
			return object;
		}

		public Object set( final Object key, final Object value )
		{
			... ; // 保存对象
			cache.add( key, object ); // 更新缓存的对象
		}

		public void remove( final Object key )
		{
			...; // 删除对象
			cache.remove( key ); // 从缓存中清除
		}
	}

	// 其他使用该缓存的类
	....
	ItsHardToReadMyItems hard = new ItsHardToReadMyItems();
	Obecjt o = hard.get( "key1" ); // 第一次读取，会花费较长时间
	o = hard.get( "key1" ); // 第二次就几乎不需要时间了
	o = hard.get( "key2" ); // 我们假设应用还需要其它对象
	o = hard.get( "key3" );
	o = hard.get( "key1" ); // 由于后面两次的读取成功，key1缓存被废弃了,再次读取时就要重新读了。

2.11.7 区域化格式工具
这个类提供了一些有用的方法，按区域格式化不同的信息，其中主要是日期和时间。

用于格式化的格式和常量使用以下关键字取自ResourceManager：

关键字 			说明
format.date		日期格式
format.time		时间格式
format.month.i		月份名称, i的值从1至12, 1表示一月份，12表示十二月份
format.weekday.i	星期名称, i的值与Calendar.MONTH类似, 例如1表示星期天, 2表示星期一, 而7表示星期六

格式的形式类似于JavaSE实现的SimpleDateFormat类。
表达式	意义
d	每月号数(1-31), 有一位数字
dd	每月号数(1-31), 有两位数字(不足两位前面补0)
ddd	星期名称的前三个字母
dddd	星期名称
M	月份(1-12), 有一位数字
MM	月份(1-12), 有两位数字(不足两位前面补0)
MMM	月份名称前三个字母
MMMM	月份名称
yy	年份, 后两位数字(无世纪)
yyyy	年份, 四位数字(有世纪)
h	小时, 0-24, 一位数字
hh	小时, 0-24, 两垃数字(不足两位前面补0)
m	分钟, 0-59, 一位数字
mm	分钟, 0-59, 两垃数字(不足两位前面补0)
s	秒, 0-59, 一位数字
ss	秒, 0-59, 两垃数字(不足两位前面补0)

其他的字母将被全部解释为文字。单引号引起的字符串也被解释为文字。

2.11.8 工具
工具类为本库或其它库中的类提供了一些有用的方法。

2.11.8.1 安全内存分配secureAlloc
将首先尝试分配一块字节数组，拦截可能首次引发的OutOfMemoryError，呼叫垃圾收集器收集无用内在后再次尝试内在分配。

2.11.8.2 数组式矢量arrayAsVector
将一个数组对象转换为矢量。

2.11.8.3 对象相等性比较objectEquals
检查两个对象的相等性，检查null值和对象类。

2.11.8.4 重复
创建一个给定重复字母和长度的字符串。

2.11.8.5 幂
数学上计算给定数的幂

2.11.8.6 取词getWords
将一个字符串分裂成一个单词列表。这是一个可以使用不同的方法将一份文本分裂单词组的多态方法。

2.11.8.7 分裂行splitInLines
该方法通过使用给定的单词、象素长度、和字体将一个字符串分成不同的行。可以指定两种字体，首行为一个字符，其他为一个字体。

如果自动换行被禁止，只有换行字符才会导致跳至下一行，超过换行符后的字符将被丢掉，如果允许自动换行，则将会以单词为界将该行分裂成多行。

3. 许可
该openbasemovil核心库是免费的，基于GPL 2许可开放源代码。

这意味着你可以基于同一条款免费使用它：您的软件必须遵守GPL第2版或更新版本的授权许可。

如果您想要创建商业性的闭源应用，或者您想为此提供支持，请访问www.basemovil.com。

Elondra也提供和支持商业许可，并提供更多的库;我们有一个ISV计划：让你可以充分利用我们所有的库，而不限于openbasemovil核心库(数据库和同步，增强的GUI，通讯，权限管理等等)。您的应用可放置在我们的服务器上并通过它们分发出去，您可以每月从你的客户中得到报酬，我们会中其中得到一个小份额收入。

请参考 http://www.basemovil.com/en/opensource/licensing以得到更详细的许可说明。

3.1 保证
如果Elondra不再继续开发这个库，他们将以Apache 2.0相似的许可发布，允许商业性的使用。
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/215287#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jul 2008 09:31:54 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/215287</link>
        <guid>http://iwinyeah.javaeye.com/blog/215287</guid>
      </item>
      <item>
        <title>正式发布最新版本1.0.7！</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/213328" style="color:red;">http://iwinyeah.javaeye.com/blog/213328</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          经过长时间的调整，终于可以发布这个版本了！至此，我原计划这个软件的所有功能都实现了，内心十分的感概，原以为难度不会太大，结果从1.0.0版本到这个具有完整功能的版本，经过在一年多的时间。在这一年多的时间了，遇到了很多的困难，在自己的努力下，朋友的帮助下，都一一解决了。在这个软件的开发中，我虽然没有得到什么经济利益，但却增长了不少的知识，结识了几个朋友，也算是有所得了。<br /><br />对于这个软件以后的发展，我想在稳定性、易用性方面再下点功夫，如果可能的话，努力在专业性和易用性之间取得平衡就更好了（目前的确是专业性过强了一些）。
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/213328#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jul 2008 10:07:55 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/213328</link>
        <guid>http://iwinyeah.javaeye.com/blog/213328</guid>
      </item>
      <item>
        <title>弄一个碰碰球的游戏</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/211339" style="color:red;">http://iwinyeah.javaeye.com/blog/211339</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          光说不练没什么意思的，不如按它的模式做一个游戏试试吧！<br /><br />/**<br /> * ---------------------------------------------<br /> * BumperBall 碰碰球游戏<br /> * ---------------------------------------------<br /> * 在本游戏中，玩家控制一个小球碰撞屏幕上其它的小球，<br /> * 其它的小球也会从各个方向碰撞玩家的小球，球与球碰<br /> * 撞后会根据物理定律改变方向和速度，而屏幕四周有一<br /> * 些尖的针突出，如果那个小球不幸撞到了针上那它将会<br /> * 被针打破。因此玩家的目的是将其它小球撞向尖针，并<br /> * 避免自己控制的小球被撞到尖针上，玩家共有三个球，<br /> * 都打破后游戏结束。<br /> * ---------------------------------------------<br />**/<br /><br />已经可以控制小球运动，不过小球移动的物理模型模拟得不太好，还要改进，主要是力学方面的计算，包括台面阻力、玩家推动力等对球的影响与实际还不太相符。<br /><br />有兴趣的朋友可以下载试一试。
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/211339#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 09:30:11 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/211339</link>
        <guid>http://iwinyeah.javaeye.com/blog/211339</guid>
      </item>
      <item>
        <title>viewMan 的行为</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/210811" style="color:red;">http://iwinyeah.javaeye.com/blog/210811</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
// 受viewMan管理的MoveObject
private MoveObject pages[];
private int nowMoveObject;

// 行动
public final int go() {
	int i = -666;
	if (pages[nowMoveObject] != null) {
		i = pages[nowMoveObject].go();
	}
	switch (nowMoveObject) {
	default:
		//... 忽略
		break;
	case START_SCREEN:
		//... 忽略
		break;
	case TITLE_SCREEN:
		//... 忽略
		break;
	case DEMO_SCREEN:
		//... 忽略
		break;
	case HELP_SCREEN:
		//... 忽略
		break;
	case SCORE_SCREEN:
		//... 忽略
		break;
	case MENU_SCREEN:
		//... 忽略
		break;
	case HOUSE_SCREEN:
		//... 忽略
		break;
	case NEWRECORD_SCREEN:
		//... 忽略
		break;
	case SETUP_SCREEN:
		//... 忽略
		break;
	case ABOUT_SCREEN:
		//... 忽略
		break;
}

</pre><br /><br />由viewMan驱动游戏进程(例如页面的切换)
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/210811#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 23:02:36 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/210811</link>
        <guid>http://iwinyeah.javaeye.com/blog/210811</guid>
      </item>
      <item>
        <title>MoveObject接口</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/209950" style="color:red;">http://iwinyeah.javaeye.com/blog/209950</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
import javax.microedition.lcdui.Graphics;

/** 可移动对象接口 */
public interface MoveObject {
	/**
	 * 准备工作
	 * 
	 * @param FullCanvas
	 *            theCanvas 底级界面对象
	 */
	public abstract void initObject(FullCanvas theCanvas);

	/**
	 * 在指定的画布上做好准备工作
	 * 
	 * @param Graphics
	 *            g 画布
	 */
	public abstract void preDraw(Graphics g);

	/**
	 * 动一下
	 * 
	 * @return int 下一动作ID
	 */
	public abstract int go();

	/**
	 * 在指定的画布上绘制画面
	 * 
	 * @param Graphics
	 *            g 画布
	 */
	public abstract void drawOut(Graphics g);
}
</pre><br />上篇主线程中用到的viewMan就实现了这个接口
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/209950#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 22:37:53 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/209950</link>
        <guid>http://iwinyeah.javaeye.com/blog/209950</guid>
      </item>
      <item>
        <title>游戏主线程</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/209943" style="color:red;">http://iwinyeah.javaeye.com/blog/209943</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          该游戏的主线程处于继续自Canvas有类中：<br /><pre name="code" class="java">
/**
 * 游戏线程
 */

// 每33毫秒一个循环（即每秒24帧）
private final static int MIN_LOOP_TIME = 33;
// 每5步刷新一次屏幕
private final static int MIN_REPAINT_LOOP = 5;

public final void run() {
	Thread.currentThread().setPriority(1);
	time = System.currentTimeMillis();
	try {
		while (true) {
			//... 部分省略
			viewMan.go();//viewMan是视图控制器，由它控制游戏的进行。

			// 一般情况下循环MIN_REPAINT_LOOP次才刷新屏幕
			// 有刷新要求除外
			if (needRepaint || loops > MIN_REPAINT_LOOP) {
				repaint();
				serviceRepaints();
				loops = 0;
			} else {
				loops++;
			}
			//nowStep++;
			// 保证一次循环最少要有MIN_LOOP_TIME,若不足则加入延时
			long l = (time + MIN_LOOP_TIME) - System.currentTimeMillis();
			if (l > (long) 0) {
				synchronized (this) {
					wait(l);
				}
				// 延时后要对屏幕进行刷新
				needRepaint = true;
			} else {
				needRepaint = false;
			}
			time += MIN_LOOP_TIME;
		}
	} catch (InterruptedException interruptedexception) {
	}
}

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/209943#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 22:06:35 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/209943</link>
        <guid>http://iwinyeah.javaeye.com/blog/209943</guid>
      </item>
      <item>
        <title>图片陈列</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/209939" style="color:red;">http://iwinyeah.javaeye.com/blog/209939</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">package main;

import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**
 * 图片阵列 图片阵列由多个相同尺寸的图片构成
 */
public class ImageGrid {

 private Image image;

 public int unitWidth;

 public int unitHeight;

 private int picturesPerLine;

 /**
  * 构建函数
  * 
  * @param String
  *            s 图片资源名称
  * @param int
  *            w 每个图片的宽度
  * @param int
  *            h 每个图片的高度
  */
 public ImageGrid(String s, int w, int h) {
  try {
   image = Image.createImage(s);
  } catch (IOException ioexception) {
   System.out.println("Unable to load image");
  }
  unitWidth = w;
  unitHeight = h;
  picturesPerLine = image.getWidth() / w;
 }

 /**
  * 将指定索引值的图片显示在画布指定位置
  * 
  * @param Graphics
  *            g 画布
  * @param int
  *            x 左上角的x坐标
  * @param int
  *            y 左上角的y坐标
  * @param int
  *            index 图片在图象组中的索引
  */
 public final void drawOne(Graphics g, int x, int y, int index) {
  g.setClip(x, y, unitWidth, unitHeight);
  g.drawImage(image, x - index % picturesPerLine * unitWidth, y - index / picturesPerLine * unitHeight, Graphics.TOP | Graphics.LEFT);
 } 
}

</pre><br />代码很简单，读入一个由多个图片拼接而成的大图片，要绘制的时候并不新建图片，而是采用绘制整个图片的方式，但在绘制图片前根据要绘制的小图片的index先设置显示裁剪区。<br /><br />这种方式实现得很简洁，并且无须生成新图片，而速度是否受到影响则大家可以实测一下。
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/209939#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 22:01:50 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/209939</link>
        <guid>http://iwinyeah.javaeye.com/blog/209939</guid>
      </item>
      <item>
        <title>学习前言</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/209938" style="color:red;">http://iwinyeah.javaeye.com/blog/209938</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          想学习一下游戏制作的一些实用的技巧，因而从上几个星期前开始对Overloaded公司2002年出品的PillsAnd Thrills进行反编译，该代码很小，jar包只有92K，原以为一个星期可以搞好，想不到搞了两个星期，还剩游戏的AI部分还完全理解，后来忙于升级手机理财JAccount就把这件事放下了，现在刚好有一些时间续一下。<br /><br />由于版权的原因，不能将反编译的代码完全公布出来，但我会将一些我认为有价值的类的代码列出来，供大家参考，也欢迎大家讨论。<br /><br />这里先放上该游戏：PillsAndThrills.jar 大家可以先玩一下有个大概的印象，也可以试着反编译一下看看。
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/209938#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 21:59:50 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/209938</link>
        <guid>http://iwinyeah.javaeye.com/blog/209938</guid>
      </item>
      <item>
        <title>准备升级到1.0.7</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/206932" style="color:red;">http://iwinyeah.javaeye.com/blog/206932</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          由于忙于对手机理财的升级，很长时间都没有更新博客了。<br />经过这段时间的努力，功能差不多完成了：<br />主要增加了以下功能：<br />1、最新支持小数点了；<br />2、支持定期交易；<br />3、加入了滚动提示；<br /><br />正在真机上测试。<br /><br />现在在P990真机上测试出一点小问题，<br />canvas 无论是否使用ticker，返回的屏幕高度是一样的，WTK和P990的模拟器上则不会出现此问题，这个问题导致理财软件的屏幕下方图标栏在打开ticker的时候显示不出来，不过关掉ticker就好了，还未找出原因，如果有谁碰到过这个问题并知道原因或者知道一些失败的方法的话，望告知。
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/206932#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 22 Jun 2008 22:59:06 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/206932</link>
        <guid>http://iwinyeah.javaeye.com/blog/206932</guid>
      </item>
      <item>
        <title>升级到1.0.6</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/190442" style="color:red;">http://iwinyeah.javaeye.com/blog/190442</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          唉!多一个符号,害我找了半天.<br />由于输入错误,造成在1.0.5版中密码失效,现已更正.<br />我把(status&0x04) == 0x04 写成了(status&=0x04) == 0x04了!
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/190442#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 06:37:31 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/190442</link>
        <guid>http://iwinyeah.javaeye.com/blog/190442</guid>
      </item>
      <item>
        <title>超简单的一个小游戏：平移魔方</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/182794" style="color:red;">http://iwinyeah.javaeye.com/blog/182794</a>&nbsp;
          发表时间: 2008年04月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个很小的游戏，与立体魔方的原理是相同的。<br /><br />在这个游戏中,玩家通过水平或垂直推动整行整列的方块,使同一颜色的方块全部排成行或列。<br /><br />红色虚线框框起的为当前可推动的行或列，方向键推动或改变要推动的行或列。<br /><br />可别小看它哦，虽然简单，解决它可要费些脑筋呢！<br /><br />花了我四天业余时间。<br /><br />不好意思，由于打乱排序的代码有一个错误，因此导致难度没有实际反映到平移魔方中，现已更正。
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/182794#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Apr 2008 09:53:58 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/182794</link>
        <guid>http://iwinyeah.javaeye.com/blog/182794</guid>
      </item>
      <item>
        <title>备份和恢复功能弄好了！</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/181094" style="color:red;">http://iwinyeah.javaeye.com/blog/181094</a>&nbsp;
          发表时间: 2008年04月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在尝试了N种方法，最终放弃了避免使用FileConnection努力，使用FileConnection实现了备份和恢复功能，它将指定帐本的数据以文本的方式导出到手机文件夹中，恢复时，从手机文件夹中指定存有帐本的文件名称就OK了。已知问题：Philips768不能安装（Class not found Exception），Nokia6070备份不成功（在Nokia上查该机资料,该机其实不支持FileConnection）,Nokia2630 OK, K750 OK, P990 OK, N72 OK, N70 OK.
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/181094#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Apr 2008 09:32:47 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/181094</link>
        <guid>http://iwinyeah.javaeye.com/blog/181094</guid>
      </item>
      <item>
        <title>只有对不起不支持FileConnection的手机了</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/179127" style="color:red;">http://iwinyeah.javaeye.com/blog/179127</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          试了很多的方法，查了不少的资料，未能找到不使用FileConnection的实现备份和恢复功能的方法，而备份和恢复功能实在太重要了，如果没有这两个功能，相同使用手机理财JAccount的用户会很不方便。不能再拖了，用FileConnection实现吧，对不起了，不支持FileConnection的手机。
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/179127#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 12:31:34 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/179127</link>
        <guid>http://iwinyeah.javaeye.com/blog/179127</guid>
      </item>
      <item>
        <title>如何利用WMA的发送与接收来实现数据的备份和恢复呢？</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/178485" style="color:red;">http://iwinyeah.javaeye.com/blog/178485</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
package util;

import java.io.IOException;

import javax.microedition.io.Connector;
import javax.wireless.messaging.Message;
import javax.wireless.messaging.MessageConnection;
import javax.wireless.messaging.MessagePart;
import javax.wireless.messaging.MultipartMessage;

import mvc.MVCMidlet;

public class MMS extends Thread {

	private static String content;

	private static String phoneNumber;

	private int action = 0;

	private final static int SEND = 0;

	private final static int RECEIVE = 1;
	
	private final static String mmsURL = "mms://";

	private final static String appID = ""; //":cn.kingdart.jaccount.book";

	private static MVCMidlet midlet;
	
	public MMS() {

	}

	public static void send(MVCMidlet theMidlet, String theContent, String thePhoneNumber) {
		
		midlet = theMidlet;
		
		content = theContent;

		phoneNumber = thePhoneNumber;
		
		MMS mms = new MMS();
		mms.action = SEND;		
		(new Thread(mms)).run();
	}

	public static void receive(MVCMidlet callMidlet) {
		
		midlet = callMidlet;
		
		MMS mms = new MMS();
		mms.action = RECEIVE;
		(new Thread(mms)).run();
	}

	public void run() {
		if (action == SEND) {
			sendNow();
		}

		if (action == RECEIVE) {
			receiveNow();
			midlet.handleCommand(MVCMidlet.SHOW_LOG, null);
		}
	}

	private void sendNow() {
		MessagePart mpart = null;

		String mimeType = "text/plain";

		String encoding = "GB2312";

		byte[] contents = null;

		try {

			contents = content.getBytes(encoding);

			mpart = new MessagePart(contents, 0, contents.length, mimeType,

			"id" + Integer.toString(1), "contentLocation", encoding);

		} catch (Exception e) {

			System.out.println("MMS " + e.toString());
			return;

		}

		String address = mmsURL + phoneNumber + appID;

		MessageConnection mmsconn = null;

		if (mpart == null) {

			return;

		}

		try {

			mmsconn = (MessageConnection) Connector.open(address);

			MultipartMessage mmmessage = (MultipartMessage) mmsconn

			.newMessage(MessageConnection.MULTIPART_MESSAGE);

			mmmessage.setAddress(address);

			mmmessage.addMessagePart(mpart);

			mmmessage.setSubject("MMS Text");

			mmsconn.send(mmmessage);

			mmsconn.close();

		} catch (Exception e) {

			System.out.println("MMS " + e.toString());

		}

	}

	private void receiveNow() {
		/** MMS connection to be read. */
		String mmsConnection = mmsURL + appID;
		/** Open the message connection. */
		MessageConnection mmsconn;
		/** Current message read from the network. */
		Message msg;
		/** Address of the message's sender */
		String senderAddress;
		/** The subject of the message received */
		//String subject;
		/** The text of the received message */
		//String contents;
		try {
			mmsconn = (MessageConnection) Connector.open(mmsConnection);
			msg = mmsconn.receive();
			if (msg != null) {
				
				senderAddress = msg.getAddress();
				String titleStr = senderAddress.substring(6);
				int colonPos = titleStr.indexOf(":");
				if (colonPos != -1) {
					titleStr = titleStr.substring(0, colonPos);
				}
				Log.append(titleStr, Log.MESSAGE);
				
				if (msg instanceof MultipartMessage) {
					MultipartMessage mpm = (MultipartMessage) msg;
					Log.append("subject: " + mpm.getSubject(), Log.MESSAGE);
					Log.append("Date: " + mpm.getTimestamp().toString(), Log.MESSAGE);
					Log.append("Content: " + mpm.getTimestamp().toString(), Log.MESSAGE);
					MessagePart[] parts = mpm.getMessageParts();
					if (parts != null) {
						for (int i = 0; i &lt; parts.length; i++) {
							MessagePart mp = parts[i];
							Log.append("Content-Type: " + mp.getMIMEType(), Log.MESSAGE);
							//String contentLocation = mp.getContentLocation();
							byte[] ba = mp.getContent();
							Log.append("Content: " + new String(ba), Log.MESSAGE);
							//Image image = Image.createImage(ba, 0, ba.length);
						}
					}
				}
			}
		} catch (IOException e) {
			Log.append(e.getMessage(), Log.MESSAGE);
			//e.printStackTrace();
		}
	}

}
</pre><br /><br />使用以上代码，可以将彩信发送出去，手机也能收到，如果把appID = "" 后面的注释":cn.kingdart.jaccount.book"拿掉则手机收不到。我的midlet没有监听，不知道启动监听会不会收到所发的彩信？<br />收到彩信后运行接收方法则没有任何回应。<br />是不是一定要启动监听器才可以接收到彩信呢？不能读取已收到的彩信吗？如果是的话，那么利用这个方法和备份和恢复就行不通了！
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/178485#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 16:41:45 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/178485</link>
        <guid>http://iwinyeah.javaeye.com/blog/178485</guid>
      </item>
      <item>
        <title>Nokia 2630i Error in HTTP operation</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/177655" style="color:red;">http://iwinyeah.javaeye.com/blog/177655</a>&nbsp;
          发表时间: 2008年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上次解决了移动资费页的问题,以为基本OK了,今天测试2630i的机子的时候,在这个方法里抛出 Error in HTTP operation, 上网查了一个,老外有几个贴子是关于这个问题的,其中一个解决方法是先Get一下,再Post,已试过,没用,另一个方法是url = URLCode.encode(url),也试过了,没用．唉，刚出狼窝，又入虎口啊！<br /><pre name="code" class="java">
public HttpConnection openHttpConnection(String url, String contentType) throws IOException{
	int i = 0;
		
	HttpConnection sc = null;
	for(i = 0; i &lt; 5; i++){
		if (sc != null) {
			sc.close();
		}
		sc = (HttpConnection) Connector.open(url, Connector.READ, true);
		sc.setRequestMethod(HttpConnection.GET);
		if (sc.getHeaderField("Content-Type").indexOf(contentType) > -1) {
			if (sc.getResponseCode() == HttpConnection.HTTP_OK) {
				return sc;
			}
			break;
		}
	}
	throw new IOException("Max Connector open count.");
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/177655#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Mar 2008 21:07:55 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/177655</link>
        <guid>http://iwinyeah.javaeye.com/blog/177655</guid>
      </item>
      <item>
        <title>计划：弄个FTP服务器，上传和下载帐本。</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/176690" style="color:red;">http://iwinyeah.javaeye.com/blog/176690</a>&nbsp;
          发表时间: 2008年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          不是每个手机都支持FileConnection的，这导致我写含有备份和恢复功能的手机理财在不支持的机器上可能连载入的机会都没有（Class not found Exception）,因此，如果可以利用ftp的上传和下载能力来完成备份和恢复功能就好了。现在还不知道可能性大不大呢？<br /><br />备份和恢复功能的确是很有用的，象Nokia6070的手机，升级时它并不覆盖原来的应用，而是重新装一个新的，这样，原来的数据就不能再用了，这对用户来说是很不爽的。我的P990倒好，升级的时候它会问我是否保留原来的数据，很好的，但你总不能要求用户都用这种机器吧。<br /><br />再不行的话用彩信、短信的方式也可以考虑。<br />有时间的看看，有想法的提出来，有资料的请提供。谢谢！
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/176690#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Mar 2008 11:54:21 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/176690</link>
        <guid>http://iwinyeah.javaeye.com/blog/176690</guid>
      </item>
      <item>
        <title>j2me如何读取网上资源文件例如文本文件，图形文件</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/176062" style="color:red;">http://iwinyeah.javaeye.com/blog/176062</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          j2me如何读取网上资源文件例如文本文件，图形文件。<br /><br />例如，读取www.kingdart.cn/jaccount/imobile.png 转换为Image<br />又例如：读取www.kingdart.cn/jaccount/readme.txt 转换为String<br /><br />只在模拟器上成功我也会，要求是真机上成功！<br />搞了我二天了,读到的是一些xml的文本,根本不沾边!
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/176062#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 22:58:55 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/176062</link>
        <guid>http://iwinyeah.javaeye.com/blog/176062</guid>
      </item>
      <item>
        <title>OpenBaseMovil 升级机制</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/175246" style="color:red;">http://iwinyeah.javaeye.com/blog/175246</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
   protected void startApp()
            throws MIDletStateChangeException
    {
        try
        {
            // If the last time the application exited it set the install.url
            // setting, it means that we should install a new version of the
            // midlet and exit again
            final String installURL = Settings.getProperty( "install.url" );
            if( installURL != null )
            {
                Settings.setProperty( "install.url", null );
                platformRequest( installURL );
                destroyApp( true );
                notifyDestroyed();
            }
            else
            {
                ((MainController) ViewFactory.getController( "main" ))
                        .startApplication();
            }
        }
        catch( Exception e )
        {
            log.error( e );
            throw new MIDletStateChangeException( e.getMessage() );
        }
    }
</pre><br />从代码可以看出其机制:正常情况下,升级URL是空的,当用户希望升级时,将在RMS中设置升级URL,在应用下次启动时,检测到升级URL不为空就进入了升级流程:<br />1. 首先清空升级URL值(用户升级后可能保留其RMS数据)<br />2. 发出平台下载请求(升级URL)<br />3. 退出应用(应用运行时是不可能升级的)<br /><br />我的想法:在对于每个应用,在服务器中设置一个文件,里面有应用最新的版本号,当用户发出升级命令时,检查服务器文件的版本号,若比现时的应用高,则进入2,3流程
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/175246#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 24 Mar 2008 07:23:33 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/175246</link>
        <guid>http://iwinyeah.javaeye.com/blog/175246</guid>
      </item>
      <item>
        <title>J2ME如何调用浏览器呢?</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/175056" style="color:red;">http://iwinyeah.javaeye.com/blog/175056</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我在WTK模拟器上midlet上试过以下代码,是可以使桌面IE自动启动并定位对应的URL的,但在手机上应如何做呢?<br />我试过<br />platformRequest("wap.17wap.com")<br />platformRequest("wap.google.com")<br />platformRequest("17wap.com")<br />手机都无反应<br /><pre name="code" class="java">
if(platformRequest("http://www.google.com")){
	exitRequested();
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/175056#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 23 Mar 2008 13:04:08 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/175056</link>
        <guid>http://iwinyeah.javaeye.com/blog/175056</guid>
      </item>
      <item>
        <title>WTK模拟器之RMS(5 还是有可能在手机上做出文件式RMS的)</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/174850" style="color:red;">http://iwinyeah.javaeye.com/blog/174850</a>&nbsp;
          发表时间: 2008年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我的错!在没有认真阅读FileConnection文档之后就妄下结论.最近下载了fileconnection_spec_1.00文档,发现其中有一个方法<br />public java.io.OutputStream openOutputStream(long byteOffset)<br />                                      throws java.io.IOException<br />该方法在打开输出流时可指定写入的位置,写入的数据将覆盖旧数据,利用这个方法,还是有可能在手机上实现文件式RMS的.<br /><br />现在我正在做手机理财JAccount的文件备份和恢复,还分不出身来尝试,有兴趣的朋友可以自已试一下如果OK了,别忘了告诉我一声哦!
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/174850#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Mar 2008 17:00:55 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/174850</link>
        <guid>http://iwinyeah.javaeye.com/blog/174850</guid>
      </item>
      <item>
        <title>FileConnection如何使用?</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/174754" style="color:red;">http://iwinyeah.javaeye.com/blog/174754</a>&nbsp;
          发表时间: 2008年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          由于要为手机理财JAccount增加数据导出到文本文件功能,我为其增加了exportToFile(String fileName)方法,使用Moto模拟器(A630)时发现装入JAR阶段已出错,错误的信息是:<br />ALERT: Unable to load class javax/microedition/io/file/FileConnection,RAZR_V3则正常.要知道,我从未打算为不同的手机制作不同的JAR,我计划是在代码中检查该手机是否支持FileConnection,若支持的话,菜单项才增加备份和恢复命令项.<br />如果所有不支持FileConnection的手机都不能装入的话,那不是只能为支持的开发一个版本,不支持的又开发另一个版本?
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/174754#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Mar 2008 10:54:54 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/174754</link>
        <guid>http://iwinyeah.javaeye.com/blog/174754</guid>
      </item>
      <item>
        <title>字段输入流FieldInuptStream</title>
        <author>iwinyeah</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
          链接：<a href="http://iwinyeah.javaeye.com/blog/174645" style="color:red;">http://iwinyeah.javaeye.com/blog/174645</a>&nbsp;
          发表时间: 2008年03月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
/**
 * --------------------------------------------------
 * 字段输入流
 * --------------------------------------------------
 * 从DataInputStream继承
 * 主要增加了从文本格式输入流中读入数据字段的能力
 * --------------------------------------------------
 * 
 * @author iwinyeah 李永超
 * @version 1.0.0
 * */

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;

public class FieldInputStream extends DataInputStream {
	public final static int BIN_MODE = 0;

	public final static int TXT_MODE = 1;

	int mode;

	public FieldInputStream(InputStream in, int mode) {
		super(in);
		this.mode = mode;
	}

	public boolean getBoolean() throws IOException {
		if (mode == 0) {
			return readBoolean();
		} else {
			if ("1".equals(next())) {
				return true;
			}
			return false;
		}
	}

	public byte getByte() throws IOException {
		if (mode == 0) {
			return readByte();
		} else {
			return (byte) Integer.parseInt(next());
		}
	}

	public short getShort() throws IOException {
		if (mode == 0) {
			return readShort();
		} else {
			return (short) Integer.parseInt(next());
		}
	}

	public int getInt() throws IOException {
		if (mode == 0) {
			return readInt();
		} else {
			return Integer.parseInt(next());
		}
	}

	public long getLong() throws IOException {
		if (mode == 0) {
			return readLong();
		} else {
			return Long.parseLong(next());
		}
	}

	public String getString() throws IOException {
		if (mode == 0) {
			if (read() == 0) {
				return null;
			} else {
				return readUTF();
			}
		} else {
			return next();
		}
	}

	// 取下一标识符
	private byte[] buffer = new byte[255];

	private int length = 0;

	private boolean eos = false;

	private final static int INITIAL = 0;

	private final static int ESCAPE = 1;

	private final static int COMMENT_START = 2;

	private final static int LINE_COMMENT = 3;

	private final static String WHITESPACE = "\n\r\t";

	public String next() throws IOException {
		length = 0;
		int c = in.read();
		int status = INITIAL;
		READWHILE: while (c != -1) { // 一直读到文件尾

			switch (status) {
			case INITIAL:
				if (c == '\n' || c == '\t') { // 如果是分隔符
					break READWHILE;
				} else if (c == '\\') {
					status = ESCAPE; // 设转义字符标志
				} else if (c == '/') {
					status = COMMENT_START; // 设注释标志
				} else {
					if (WHITESPACE.indexOf(c) &lt; 0) {
						append(c);
					}
				}
				break;

			case ESCAPE: // 处理转义字符
				switch (c) {
				case 'n':
					append('\n');
					break;

				case 'r':
					append('\r');
					break;

				case 't':
					append('\t');
					break;

				case 'b':
					append('\b');
					break;

				case 'f':
					append('\f');
					break;

				default:
					append(c);
					break;
				}
				status = INITIAL; // 设正常情况标志
				break;

			case COMMENT_START: // 处理注释
				if (c == '/') {
					status = LINE_COMMENT; // 是行式注释
				} else {
					status = INITIAL;
					// 如果都不是则把注释起始符和刚读入的字符都加入到标识符中
					append('/');
					append(c);
				}
				break;

			case LINE_COMMENT:
				if (c == '\n') {
					status = INITIAL; // 如果当前为行注释状态则要一直读到行尾才恢复正常情况标志
					break READWHILE;
				}
				break;
			}
			c = in.read(); // 读入下一字符
		}

		if (c == -1) {
			eos = true;
		}

		// 如果读到文件尾时，标识符长度大于零，则返回标识符，否则返回NULL值
		if (length &lt;= 0) {
			return null;
		} else {
			return new String(buffer, 0, length, "UTF-8");
		}
	}

	// 将读入的字符加入缓冲区
	private void append(int c) {
		// 缓冲区不足时自动扩展
		if (length >= buffer.length) {
			byte[] xBuffer = new byte[buffer.length + 16];
			System.arraycopy(buffer, 0, xBuffer, 0, buffer.length);
			buffer = null;
			buffer = xBuffer;
		}

		buffer[length++] = (byte) c;
	}

	public boolean eos() {
		return eos;
	}
}
</pre><br />请参看我的另一篇文章：字段输出流FieldOutputStream<a href="http://iwinyeah.javaeye.com/admin/blogs/174644" target="_blank">http://iwinyeah.javaeye.com/admin/blogs/174644</a>
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/174645#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Mar 2008 22:18:38 +0800</pubDate>
        <link>http://iwinyeah.javaeye.com/blog/174645</link>
        <guid>http://iwinyeah.javaeye.com/blog/174645</guid>
      </item>
  </channel>
</rss>