﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Art of life-随笔分类-J2ME</title><link>http://www.blogjava.net/wiser/category/20778.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 Mar 2007 21:02:29 GMT</lastBuildDate><pubDate>Mon, 19 Mar 2007 21:02:29 GMT</pubDate><ttl>60</ttl><item><title>J2ME程序开发新手入门九大要点</title><link>http://www.blogjava.net/wiser/archive/2007/03/19/104787.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Mon, 19 Mar 2007 11:20:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/19/104787.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104787.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/19/104787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104787.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<p>[转贴自yesky]<br />一、J2ME中需要的Java基础知识<br />　　现在有大部分人，都是从零开始学J2ME的，学习J2ME的时候，总是从Java基础开始学习，而且现在讲Java基础的书籍中都是以J2SE来讲基础，这就给学习造成了一些不必要的麻烦，下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明。<br />　　J2ME中使用到的Java基础知识：<br />　　 1、Java语法基础：包括基本数据类型、关键字、运算符等等<br />　　 2、面向对象的思想：类和对象的概念，继承和多态等等。<br />　　 3、异常处理<br />　　 4、多线程<br />　　J2ME中没有用到的Java基础知识：<br />　　 1、JDK中javac和java命令的使用 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 2、Java基础中的很多类在J2ME中没有，或者类中的方法做了大量的精简。所以建议在J2ME中熟悉类库。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 3、Applet、AWT、Swing这些知识在J2ME中根本使用不到。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　简单说这么多，希望学J2ME的朋友们能少走一些弯路，不足之处希望大家积极指正和补充。 <br />　　二、J2ME中暂时无法完成的功能<br />　　列一些J2ME中暂时无法完成的功能，希望大家能积极补充： </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 1、在手机中不更改代码实现移植，主要指游戏。<br />　　 2、动态修改按钮文字。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 3、在Canvas上接受中文输入。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 4、操作本地资源、例如地址本、已收短信息等。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 5、制作破坏性的手机病毒。<br />　　 6、其他等待大家来补充。<br />　　三、J2ME的跨平台性<br />　　J2ME技术源于Java，所以也具有JVM的优势，可以在支持Java的平台上进行移植，但是现在的J2ME技术在跨平台上却做的很糟糕，我们来简单看一下原因：<br />　　1、手机的屏幕尺寸不一：<br />　　这个主要在界面制作上。如果你使用的是高级用户界面，比如你做的是应用开发或者用户登陆、用户注册这样的通用功能时，一般没有什么问题。<br />　　如果你使用的是低级用户界面，比如你做的是游戏，那么你就需要考虑这个问题了。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　2、厂商的扩展API不统一： </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　例如Nokia的扩展API类库UI系列，在别的手机上或者没有实现，或者包名不同等等。<br />　　3、手机平台上实现的bug：<br />　　例如Nokia的7650在实现双缓冲上有bug，那么在这种机型上运行的软件就不能使用双缓冲。其他NOKIA上的一些bug，可以参看：<a href="http://www.cnjm.net/resfetch/EKayXl5MlY2NaSIHXDqIdRYYOhhiXo2ZYQgiaQcmaY1ha4iyCKZijcsVFcqNFWSNy6SNZMvczstkOmF1THk_">http://www.cnjm.net/resfetch/EKayXl5MlY2NaSIHXDqIdRYYOhhiXo2ZYQgiaQcmaY1ha4iyCKZijcsVFcqNFWSNy6SNZMvczstkOmF1THk_</a><br />　　4、手机性能问题。<br />　　不同手机的可用内存、最大jar文件都有要求，例如Nokia S40的大部分手机支持的最大jar文件为64K，最大可用内容为210K。<br />　　所以现在的手机软件，特别是游戏都提供支持的机型列表，也才有了手机游戏移植人员的存在。<br />　　四、学习J2ME可以从事的工作种类<br />　　现在J2ME技术可以说相当的火暴，这里介绍一些学好了J2ME之后可以从事的工作的种类：<br />　　1、J2ME游戏开发人员<br />　　根据游戏策划或者文档要求，在某种特定的机型(以Nokia S40或S60居多)开发游戏程序。这是现在大部分J2ME程序员从事的工作。<br />　　需要熟练掌握：高级用户界面、低级用户界面、线程，如果是网络游戏，还需要熟练网络编程。<br />　　2、J2ME应用开发人员 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　现在的移动应用还不是很多，但是还是出现了一些，特别是移动定位以及移动商务相关的内容。需要熟练掌握：高级用户界面、线程和网络编程。<br />　　3、J2ME游戏移植人员<br />　　参照源代码，将可以在一个平台上可以运行的游戏移植到其他平台上去。例如将Nokia S40的游戏移植到S60上，或者索爱的T618等等。主要是控制屏幕坐标，有些可能需要替换一些API。<br />　　需要熟悉各平台之间的差异以及相关的技术参数，比如屏幕大小、最大jar文件尺寸等等。<br />　　五、J2ME程序设计的几个原则<br />　　1、使用面向对象编程。<br />　　虽然使用面向过程编程可以减小文件的尺寸，但是为了以后维护的方便和利于扩展，还是要使用面向对象编程。<br />　　2、使用MVC模式<br />　　将模型、界面和控制分离。现在很多的程序将三者合一，但是如果你做的程序比较大的话，还是建议你进行分离。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　3、自动存储用户设定<br />　　使用RMS来存储用户的信息，例如存储用户上次输入的用户名、密码、用户对于系统的设定等，这样不仅可以减少用户的输入，而且对用户友好。很多程序甚至做了自动登陆等。<br />　　4、一些系统设置允许用户关闭。如背景音乐、背景灯显示等。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　5、将低级用户界面的绘制动作放在一个独立的线程里面去。<br />　　6、在需要大量时间才能完成的工作时，给用户一个等待界面。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　六、从模拟器到真机测试<br />　　对于J2ME开发者来说，模拟器给我们带来了很多方便，比如可以在模拟器中调试程序以及很方便的察看程序的效果，但是模拟器也给我们带来了一些问题，比如模拟器实现的bug等等，所以进行真机测试是必须的。<br />　　1、为什么要进行真机测试？ </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　因为模拟器程序可能存在bug，以及真机的性能有限，所以必须进行真机测试。<br />　　2、如何将程序传输到机器中？<br />　　将程序传输到机器中有如下方式：<br />　　 a)　OTA下载<br />　　 b)　使用数据线传输 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 c)　红外传输 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 d)　蓝牙<br />　　你可以根据条件，选择合适的方式。<br />　　3、 真机测试主要测什么？ </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　真机测试的内容很多，主要测试以下几个方面：<br />　　 a)　程序的功能<br />　　 b)　程序的操作性，是否易操作 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 c)　程序的大小,比如Nokia S40系列的手机大部分接受的最大文件尺寸为64K<br />　　 d)　程序运行速度，速度是否可以忍受。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　七、从WTK到厂商SDK<br />　　对于J2ME爱好者来说，基本上大家都是从SUN的WTK(J2ME Wireless Toolkit)开始的，但是对于实际应用来说，仅仅使用WTK是远远不够的，所以在学习过程中，必须完成从WTK到SDK的跨越。<br />　　1、厂商SDK的下载地址？<br />　　·Nokia <br />　　Nokia不愧为手机行业的老大，对于j2me的支持也是一流的，有专门的网站提供SDK和各种文档说明。<br />　　网址是：<a href="http://www.cnjm.net/resfetch/Dbvxamo8cwoKpIh4z44.G4iEykM.MYiOPzEbCpMx8QrKGwv7TD.xao4N">http://www.cnjm.net/resfetch/Dbvxamo8cwoKpIh4z44.G4iEykM.MYiOPzEbCpMx8QrKGwv7TD.xao4N</a><br />　　·Siemens </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　Siemens对于J2ME的支持也不错，它提供了SDK，模拟器需要独立安装。下载地址如下：<br /><a href="http://www.cnjm.net/resfetch/BVBDcHC9yrySkj0S7e24pIs9PnCLEqR77T4GZi5wS8qLLu0upMpLjS6SvRIGcD7qku0-i6RLPsq9OjfEPqTCQkUOt6kgPoukIC6kuEJFDnqpxC59cEJFDnqpvYuNDhSpPYuNDrepcIuNDuu3t7epOouNDrc_">http://www.cnjm.net/resfetch/BVBDcHC9yrySkj0S7e24pIs9PnCLEqR77T4GZi5wS8qLLu0upMpLjS6SvRIGcD7qku0-i6RLPsq9OjfEPqTCQkUOt6kgPoukIC6kuEJFDnqpxC59cEJFDnqpvYuNDhSpPYuNDrepcIuNDuu3t7epOouNDrc_</a><br />　　·SonyEricsson </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　SonyEricsson SDK以及自己的模拟器，下载地址为：<br />　[url]http://developer.sonyericsson.com/site/global/docstools/java/p_java.jsp/url]<br /><a href="http://www.cnjm.net/resfetch/BEe.ZGSB34qK5B9NqS2pZHWSH9stlFti26l4xsYfsFt4H-RbeLCKlGLEYi0fgeRisGSKlB-SsC0fQ5RFv6lkW0PGgQ__">http://www.cnjm.net/resfetch/BEe.ZGSB34qK5B9NqS2pZHWSH9stlFti26l4xsYfsFt4H-RbeLCKlGLEYi0fgeRisGSKlB-SsC0fQ5RFv6lkW0PGgQ__</a><br />　　·Motorola<br />　　Motorola提供了专门的SDK，内部包含模拟器，下载地址为：<br /><a href="http://www.cnjm.net/resfetch/EKayXl5MlY2NPj4-OiYHXgeIBxZiazqIByaNJgdeB2sHImGNTIh1gAcmYjrBdUw_">http://www.cnjm.net/resfetch/EKayXl5MlY2NPj4-OiYHXgeIBxZiazqIByaNJgdeB2sHImGNTIh1gAcmYjrBdUw_</a></p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　·SamSung </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　SamSung也提供了专门的SDK和模拟器，下载地址为：<br /><a href="http://www.cnjm.net/resfetch/CnUnZGQjjsPDP7oJunRUI7phlNiAL9hs4OwvVP9FdLqUb1Qvw7rg7MOjYVTgZPn9VOC6w...2MP..9j5L4BF4JRL2CPfI.kvuuBs-UU.BC4p.v4_">http://www.cnjm.net/resfetch/CnUnZGQjjsPDP7oJunRUI7phlNiAL9hs4OwvVP9FdLqUb1Qvw7rg7MOjYVTgZPn9VOC6w...2MP..9j5L4BF4JRL2CPfI.kvuuBs-UU.BC4p.v4_</a><br />　　·NEC：<br />　　NEC也提供了集成模拟器的SDK，下载地址为： </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>
				<a href="http://www.cnjm.net/resfetch/Ig9UMDBaS5eXGxsbLMm43HD4NMZquMmDLNzh-JfcyQ__">http://www.cnjm.net/resfetch/Ig9UMDBaS5eXGxsbLMm43HD4NMZquMmDLNzh-JfcyQ__</a>
				<br />　　2、厂商SDK和WTK有什么不同？ </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　厂商SDK最简单的理解就是在WTK的基础上增加了自己的模拟器和自己的扩展API。也就是说，你在使用厂商的SDK时，可以使用厂商的扩展类库，例如Nokia的UI类库，和厂商自己的模拟器而已。每个厂商的扩展API都不多，而且不尽相同。<br />　　3、如何使用？<br />　　有些厂商SDK的使用都和WTK相同，例如SamSung。Nokia提供了独立的界面来开发，但是这个界面在实际开发中使用不多。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　4、厂商SDK的问题 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　厂商SDK实现过程中，有一些bug，而且和真机实现不一致。例如NOKIA的混音播放问题等等。<br />　　八、在J2ME中获得手机IMEI的方法<br />　　IMEI是Internation mobile entity identification的简称，在手机中输入*#06#可以显示该数字，长度为15位，全球唯一，永远不会冲突，所以可以作为识别用户的一个标志。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　下面是在J2ME中获得IMEI的方法：<br />　　1、MOTO系列的手机可以通过读取系统的IMEI属性获得，代码如下： </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　 String imei = System.getProperty("IMEI");<br />　　2、SIEMENS系列的手机可以通过读取系统的com.siemens.IMEI属性获得，代码如下：<br />　　 String imei = System.getProperty("com.siemens.IMEI");<br />　　九、J2ME网络连接中显示问题的解决办法 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　在网络编程中，有些时候会出现一些在没有接收到网络数据就显示界面的，造成界面显示不符合要求（例如公告显示，会先显示公告的背景图片再显示公告信息），这里提一个简单的解决办法给大家： </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　解决这种情况的方法分成三个步骤：<br />　　1、在需要显示的界面中，调用发送网络数据的方法。每次显示时调用该构造方法，不调用Display的setCurrent方法显示。 </p>
		<p>JAVA手机网[www.cnjm.net] </p>
		<p>　　2、显示等待界面(例如进度条等)，给用户提示，在进行网络连接。<br />　　3、在处理网络反馈的数据完以后，调用Display的setCurrent方法显示显示当前界面。</p>
<img src ="http://www.blogjava.net/wiser/aggbug/104787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-19 19:20 <a href="http://www.blogjava.net/wiser/archive/2007/03/19/104787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME API 速查手册分卷下载</title><link>http://www.blogjava.net/wiser/archive/2007/03/19/104758.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Mon, 19 Mar 2007 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/19/104758.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104758.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/19/104758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104758.html</trackback:ping><description><![CDATA[
		<font color="#800080">
				<font color="#000000">
						<center>
								<h1>J2ME API 速查手册 ver 0.7 </h1>
								<center>By <a href="http://www.j2medev.com/"><font color="#002c99">j2medev.com</font></a></center>
						</center>
						<table cellspacing="0" cellpadding="3" width="100%" summary="" border="1">
								<tbody>
										<tr class="TableHeadingColor" bgcolor="#ccccff">
												<td colspan="2">
														<font size="+2">
																<b>本手册包含如下内容</b>
														</font>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>J2ME Web Services RPC (JSR 172)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>J2ME Web Services XML (JSR 172)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>Java APIs for Bluetooth (JSR 82) </b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>Location API (JSR 179)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>MID Profile 2.0 (JSR-118)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>Mobile Media API 1.1 (JSR-135)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>Mobile 3D Graphics API (JSR184)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>PDA Pim 1.0 (JSR 75)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>PDA FileConnection (JSR 75)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>J2ME Web Services RPC (JSR 172)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>Scalable 2D Vector Graphics API (JSR-226)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>SIP API (JSR 180)</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>Wireless Messaging API 1.0 (JSR 120) </b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>WTK2.2 相关文档</b>
												</td>
										</tr>
										<tr class="TableRowColor" bgcolor="white">
												<td>
														<b>Nokia UI API 1.1</b>
												</td>
										</tr>
								</tbody>
						</table>
				</font>
				<br />
				<br />
		</font>
		<a href="/Files/wiser/j2meapi.part1.rar">http://www.blogjava.net/Files/wiser/j2meapi.part1.rar</a>
		<br />
		<a href="/Files/wiser/j2meapi.part2.rar">http://www.blogjava.net/Files/wiser/j2meapi.part2.rar</a>
		<br />
		<a href="/Files/wiser/j2meapi.part3.rar">http://www.blogjava.net/Files/wiser/j2meapi.part3.rar</a>
		<br />
		<a href="/Files/wiser/j2meapi.part4.rar">http://www.blogjava.net/Files/wiser/j2meapi.part4.rar</a>
		<br />
		<a href="/Files/wiser/j2meapi.part5.rar">http://www.blogjava.net/Files/wiser/j2meapi.part5.rar</a>
<img src ="http://www.blogjava.net/wiser/aggbug/104758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-19 16:31 <a href="http://www.blogjava.net/wiser/archive/2007/03/19/104758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NokiaS40和S60开发平台1.0已知问题</title><link>http://www.blogjava.net/wiser/archive/2007/03/19/104752.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Mon, 19 Mar 2007 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/19/104752.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104752.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/19/104752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104752.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104752.html</trackback:ping><description><![CDATA[
		<p>NokiaS40和S60开发平台1.0已知问题(转贴)</p>
		<p>作者：陈跃峰 </p>
		<p>出自：<a href="http://blog.csdn.net/mailbomb">http://blog.csdn.net/mailbomb</a></p>
		<p>1、 Nokia3300不支MMA(声音处理)类库。 </p>
		<p>2、 Image.getGraphics()方法在不同的软件版本中工作不同，该方法无法在新版本的7650、3650和N-Gage中正常工作。即这些机器中无法实现双缓冲技术。 </p>
		<p>3、 Nokia7650、3650和N-Gage，无法控制背景灯和震动。 </p>
		<p>4、 同时播放声音在S60模拟器上可以运行，但是真机不支持。 </p>
		<p>5、 7650不支持WMA(短信息API)。 </p>
		<p>6、 在7210SDK1.0中softkey1和softkey2也产生left和right按键代码。 </p>
		<p>7、 在S60中堆内存不同。一般S60设备有2M，而3600只有1.6M。 </p>
		<p>8、 记录集枚举问题。在S40SDK和真机中，使用RecordStore.deleteRecord(id)以后，枚举工作不正常。 </p>
		<p>9、 Nokia6230 MIDP Concept SDK beta0.2不支持CLDC1.1。 </p>
		<p>10、 NUL字符(0x00)在TextBox中有问题。S401.0 SDK和真机中都存在该问题。 </p>
		<p>11、 如果MIDlet在后台运行时，MIDI声音不停止。S601.0中存在该问题。 </p>
		<p>12、 当正在运行的MIDlet被系统Screen隐含调用的类选择显示屏幕时有问题。在S60 1.0中存在该问题。 </p>
		<p>13、 S40界面风格中的字体大小不一致。在S40 1.0SDK和真机，以及7250i、3100、6108、6200中。 </p>
		<p>14、 Item.getLable()方法在ChoiceGroup中无法返回正确的label。 </p>
		<p>15、 在Nokia MIDP 1.0中，DeviceControl.setLights(0,0)没有关闭键区灯。屏幕等关闭，而键区等依然亮着。涉及具有翻页键盘的S40 1.0设备。 </p>
		<p>16、 在S60 1.0设备中，Date对象无法返回当前时间。 </p>
		<p>详细文档参看： </p>
		<p>http://www.forum.nokia.com/ndsCookieBuilder?fileParamID=3895</p>
<img src ="http://www.blogjava.net/wiser/aggbug/104752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-19 16:16 <a href="http://www.blogjava.net/wiser/archive/2007/03/19/104752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME中的page编码转化</title><link>http://www.blogjava.net/wiser/archive/2007/03/19/104734.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Mon, 19 Mar 2007 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/19/104734.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104734.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/19/104734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104734.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<p>作者:<a href="http://www.matrix.org.cn/user.shtml?username=cleverpig">cleverpig</a>(作者的Blog:<a href="http://blog.matrix.org.cn/page/cleverpig">http://blog.matrix.org.cn/page/cleverpig</a>)<br />原文:<a href="http://www.matrix.org.cn/resource/article/44/44154_j2me.html">http://www.matrix.org.cn/resource/article/44/44154_j2me.html</a><br />关键字:j2me，页面，编码，乱码<br />一、摘要<br />根据xinshouj2me在j2me版提出的<a href="http://www.matrix.org.cn/thread.shtml?topicId=36115&amp;forumId=4">“httpconnection网络连接的问题”</a>，本人分析了一下：由于www.163.com上的页面编码为gb2312，所以使用utf8读取由于编码方式不同会得到乱码。于是本人根据page的编码灵活进行编码转化，在此与大家共享、讨论。<br />二、代码分析<br />1.HttpConnectionHandler接口类<br />最好根据page的编码灵活进行编码转化，于是本人定义了一个HttpConnectionHandler接口类：<br />HttpConnectionHandler.java</p>
		<pre>
				<br />package com.bjinfotech.practice.j2me.httpConnection;<br /><br />import java.util.Hashtable;<br />import javax.microedition.io.HttpConnection;<br /><br />/**<br /> * Http连接处理器接口<br /> * @author cleverpig<br /> *<br /> */<br />public interface HttpConnectionHandler {<br />        //http请求常量<br />        public static final String RQH_HOST="X-Online-Host";<br />        public static final String RQH_ACCEPT="Accept";<br />        public static final String RQH_CONTENT_LANGUAGE="Content-Language";<br />        public static final String RQH_CONTENT_TYPE="Content-Type";<br />        public static final String RQH_CONNECTION_OPTION="Connection";<br />        //http回应常量<br />        public static final String RSH_DATE="Date";<br />        public static final String RSH_SERVER="Server";<br />        public static final String RSH_MODIFIEDDATE="Last-Modified";<br />        public static final String RSH_CONTENT_ENCODING="Content-Encoding";<br />        public static final String RSH_CONTENT_LENGTH="Content-Length";<br />        public static final String RSH_CONTENT_TYPE="Content-Type";<br />        <br />        public boolean putRequestHeaderProperty(<br />                        HttpConnection conn,<br />                        String key,<br />                        String keyValue);<br />        <br />        public String getResponseHeaderProperty(<br />                        HttpConnection conn,<br />                        String key);<br />        <br />        public boolean setRequestMethod(<br />                        HttpConnection conn,<br />                        String methodName);<br />        <br />        public boolean putRequestHeader(<br />                        HttpConnection conn,<br />                        Hashtable propertiesPair);<br />        <br />        public Hashtable getResponseHeader(<br />                        HttpConnection conn,<br />                        String[] propertyNames);<br />        <br />        public boolean sendRequestData(<br />                        HttpConnection conn,<br />                        Object sendData);<br />        <br />        public Object getResponseData(HttpConnection conn);<br />        <br />}<br /></pre>
		<br />2.HTML_HttpConnectionHandlerImpl类<br />根据HttpConnectionHandler接口规范实现了该接口——HTML_HttpConnectionHandlerImpl类。<br />HTML_HttpConnectionHandlerImpl.java<pre><br />package com.bjinfotech.practice.j2me.httpConnection;<br /><br />import java.io.DataOutputStream;<br />import java.io.DataInputStream;<br />import java.util.Hashtable;<br />import java.util.Vector;<br />import java.util.Enumeration;<br />import javax.microedition.io.HttpConnection;<br /><br />/**<br /> * http连接处理器实现<br /> * @author cleverpig<br /> *<br /> */<br />public class HTML_HttpConnectionHandlerImpl implements HttpConnectionHandler{<br />        private String message="";<br />        <br />        public HTML_HttpConnectionHandlerImpl(){<br />        }<br />        <br />        public boolean putRequestHeaderProperty(<br />                        HttpConnection conn,<br />                        String key,<br />                        String keyValue){<br />                message="";<br />                try{<br />                        conn.setRequestProperty(key,keyValue);<br />                        return true;<br />                }<br />                catch(Exception ex){<br />                        message=ex.getMessage();<br />                }<br />                return false;<br />        }<br />        <br />        public String getResponseHeaderProperty(<br />                        HttpConnection conn,<br />                        String key){<br />                return conn.getRequestProperty(key);<br />        }<br />        <br />        public boolean putRequestHeader(<br />                        HttpConnection conn,<br />                        Hashtable propertiesPair){<br />                Enumeration keyEnumer=propertiesPair.keys();<br />                boolean result=true;<br />                while(keyEnumer.hasMoreElements()){<br />                        String keyName=(String)keyEnumer.nextElement();<br />                        String keyValue=(String)propertiesPair.get(keyName);<br />                        if (putRequestHeaderProperty(conn,keyName,keyValue)==false){<br />                                result=false;<br />                        }<br />                }<br />                return result;<br />        }<br />        <br />        public boolean setRequestMethod(<br />                        HttpConnection conn,<br />                        String methodName){<br />                message="";<br />                try{<br />                        conn.setRequestMethod(methodName);<br />                        return true;<br />                }<br />                catch(Exception ex){<br />                        message=ex.getMessage();<br />                        return false;<br />                }<br />        }<br />        <br />        public Hashtable getResponseHeader(<br />                        HttpConnection conn,<br />                        String[] propertyNames){<br />                Hashtable result=new Hashtable();<br />                for(int i=0;i&lt;propertyNames.length;i++){<br />                        String keyValue=conn.getRequestProperty(propertyNames[i]);<br />                        result.put(propertyNames[i],keyValue);<br />                }<br />                return result;<br />        }<br />        <br />        public boolean sendRequestData(<br />                        HttpConnection conn,<br />                        Object sendData){<br />                message="";<br />                try{<br />                        DataOutputStream os=conn.openDataOutputStream();<br />                        os.writeUTF((String)(sendData));<br />                        os.flush();<br />                        return true;<br />                }<br />                catch(Exception ex){<br />                        message=ex.getMessage();<br />                        return false;<br />                }<br />        }<br />        <br />        public Object getResponseData(HttpConnection conn){<br />                DataInputStream is=null;<br />                message="";<br />                try{<br />                        is=conn.openDataInputStream();<br />                }<br />                catch(Exception ex){<br />                        message=ex.getMessage();<br />                        return null;<br />                }<br />                <br />                byte[] data=null;<br />                String type=getResponseHeaderProperty(conn,RSH_CONTENT_TYPE);<br />                int len = 0;<br />                try{<br />                        len=Integer.parseInt(getResponseHeaderProperty(conn,RSH_CONTENT_LENGTH));<br />                }<br />                catch(Exception ex){<br />                        len=0;<br />                }<br />                if (len &gt; 0) {<br />             int actual = 0;<br />             int bytesread = 0 ;<br />             data = new byte[len];<br />             while ((bytesread != len) &amp;&amp; (actual != -1)) {<br />                     try{<br />                             actual = is.read(data, bytesread, len - bytesread);<br />                             bytesread += actual;<br />                     }<br />                     catch(Exception ex){<br />                             message=ex.getMessage();<br />                             return null;<br />                     }<br />             }<br />        } else {<br />            int ch;<br />            Vector vbuffer=new Vector();<br />            try{<br />                    while ((ch = is.read()) != -1) {<br />                            vbuffer.addElement(new Integer(ch));<br />                    }<br />            }<br />                       catch(Exception ex){<br />                                message=ex.getMessage();<br />                                return null;<br />                       }<br />            len=vbuffer.size();<br />            data = new byte[len];<br />            for(int i=0;i&lt;len;i++){<br />                    data[i]=((Integer)vbuffer.elementAt(i)).byteValue();<br />            }<br />        }<br />        <br />        String result=new String(data);<br />        int flagBeginPosition=result.indexOf("charset=");<br />        int flagEndPosition=result.indexOf("\"&gt;",flagBeginPosition);<br />        if (flagEndPosition&gt;flagBeginPosition){<br />                type=result.substring(flagBeginPosition+"charset=".length(),flagEndPosition);<br />        }<br />        System.out.println("获得html字符集:"+type);<br />        if (type!=null){<br />                <br />                try{<br />                        result=new String(data,type);<br />                }<br />                catch(Exception ex){<br />                        message=ex.getMessage();<br />                }<br />        }<br />        return result;<br />        }<br />        <br />        public String getMessage(){<br />                return message;<br />        }<br />        <br />        <br />}<br /><br /></pre><br />上面实现类中根据page中的实际编码类型对html字符串进行了编码转化，这样就实现了page编码的灵活转化。<br />虽然灵活性加强了，但是对于内存的占用也随之增加了一倍。<br />三.测试代码<pre><br />package com.bjinfotech.practice.j2me.httpConnection;<br /><br />import javax.microedition.midlet.MIDlet;<br />import javax.microedition.midlet.MIDletStateChangeException;<br />import javax.microedition.io.HttpConnection;<br />import javax.microedition.io.Connector;<br />import java.util.Hashtable;<br /><br />public class HttpConnectionMIDlet extends MIDlet {<br /><br />        public HttpConnectionMIDlet() {<br />                super();<br />        }<br /><br />        <br />        protected void startApp() throws MIDletStateChangeException {<br />                HTML_HttpConnectionHandlerImpl handler=new HTML_HttpConnectionHandlerImpl();<br />                try{<br />                        String host="10.11.3.99";<br />                        String url="http://10.11.3.99:8080/test_gbk.html";<br />//                        String url="http://10.11.3.99:8080/test_gb2312.html";<br />//                        String url="http://10.11.3.99:8080/test_utf8.html";<br />                        <br />                        HttpConnection conn=(HttpConnection)Connector.open(url);<br />                        if (conn.getResponseCode()==HttpConnection.HTTP_OK){<br />                                System.out.println("建立连接成功");<br />                                <br />                                Hashtable requestHeaderPair=new Hashtable();<br />                                requestHeaderPair.put(<br />                                                HTML_HttpConnectionHandlerImpl.RQH_HOST,<br />                                                host);<br />                                requestHeaderPair.put(<br />                                                HTML_HttpConnectionHandlerImpl.RQH_CONTENT_TYPE,<br />                                                "application/octet-stream");<br />                                requestHeaderPair.put(<br />                                                HTML_HttpConnectionHandlerImpl.RQH_CONTENT_LANGUAGE,<br />                                                "en-US");<br />                                requestHeaderPair.put(<br />                                                HTML_HttpConnectionHandlerImpl.RQH_ACCEPT,<br />                                                "application/octet-stream");<br />                                requestHeaderPair.put(<br />                                                HTML_HttpConnectionHandlerImpl.RQH_CONNECTION_OPTION,<br />                                                "Keep-Alive");<br />                                handler.putRequestHeader(conn,requestHeaderPair);<br />                                handler.setRequestMethod(conn,HttpConnection.GET);<br />                                handler.sendRequestData(conn,"GET / HTTP/1.1");<br />                                if (conn.getResponseCode()==HttpConnection.HTTP_OK){<br />                                        System.out.println("发送请求成功");<br />                                        <br />                                        System.out.println("获得回应数据");<br />                                        String reponseData=(String)handler.getResponseData(conn);<br />                                        System.out.println(reponseData);<br />                                }<br />                                else{<br />                                        System.out.println("发送请求失败");<br />                                        System.out.println("错误信息:"+handler.getMessage());<br />                                }<br />                        }<br />                        else{<br />                                System.out.println("建立连接失败");<br />                        }<br />                }<br />                catch(Exception ex){<br />                        System.out.println("错误信息:"+handler.getMessage());<br />                        ex.printStackTrace();<br />                }<br />                <br /><br />        }<br />        <br />        protected void pauseApp() {<br />                <br /><br />        }<br /><br />        protected void destroyApp(boolean arg0) throws MIDletStateChangeException {<br />                <br /><br />        }<br /><br />}<br /><br /></pre><br />更多问题，请到<a href="http://www.matrix.org.cn/topic.shtml?forumId=4">Matrix J2me版</a>讨论<img src ="http://www.blogjava.net/wiser/aggbug/104734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-19 14:27 <a href="http://www.blogjava.net/wiser/archive/2007/03/19/104734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetConnection简介</title><link>http://www.blogjava.net/wiser/archive/2007/03/17/104492.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Sat, 17 Mar 2007 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/17/104492.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104492.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/17/104492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104492.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104492.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<p>一、“NetConnection”简介：<br />转述Matrix上zhengyun_ustc所述：“你的HttpConnection是否封装的足够健壮呢？遇到各种情况，你是否有信心应对呢？譬如说，你要请求的Response包实在太大，以至于运营商给你掐了告诉你说超时；譬如说你是不是总要自己写一个线程来专门作http连接？譬如说有一些移动运营商设置了caching proxy servers，妨碍了你的测试。”<br />为了解决这个问题，一位日本程序员“JAY-F”针对MIDP1.0提供了一种robust的“NetConnection”封装。这个HttpConnnection类负责管理连接并易于使用。<br />二、“NetConnection”特性：<br />1. 跨过Proxy-server阻碍：<br />一些移动网络放置了代理服务器用来提高访问速度，但是它的cache也成为了开发人员测试/调试程序的一大障碍。“NetConnection”类使用一个简单的http request属性将server上的代理功能关闭掉。<br />2. 使用线程分离的连接模式：<br />本类可以使用单线程、多线程两种模式运行，只要设置一个简单的标志即可。<br />3. 支持Http request range：<br />由于服务商在其网络上可能存在一些针对回应数据最大长度的限制，所以“NetConnection”类提供了构造request URL的功能使回应数据分为多个数据包。从而去除了前面的限制。<br />三、netConnection是如何实现的？<br />1。netConnection类结构分析：<br />此类实现了Runnable接口，其运行模式支持多线程模式：当前只能由一个线程使用资源，其它线程wait。<br />此类使用了一些静态成员变量：</p>
		<pre>
				<br />        //当前只能由一个线程使用singleton。<br />        private static NetConnection singleton = new NetConnection();<br /><br />        private static HttpConnection httpConn;<br /><br />        private static String url;<br /><br />        private static String method;<br /><br />        private static byte[] data;<br />                <br /><br />        private static String contentType;<br />        <br /><br />        private static long lowRange;<br />        <br /><br />        private static long highRange;<br />        <br /><br />        private static boolean disableProxy;<br />        <br /><br />        private static boolean detached;<br />        <br />        private static byte[] response;<br /></pre>
		<br />类方法：<pre><br />//线程run方法<br />public void run()<br /><br />//当前运行的线程执行完毕后，通报给其它的由于等待资源而wait状态的线程<br />private synchronized void forceNotify() <br /><br />//当资源正在被其它线程使用时，当前线程进入wait状态<br />private synchronized void forceWait()<br /><br />//关闭http连接<br />private static void severConnection()<br /></pre><br />由于使用了这些static成员变量，所以一些操作方法需要同步（synchronized）。<br />2。netConnection核心代码解析：<br />netConnection类的实现思想很简单，就是设置一些request属性和对于GET方法构造一个特殊的URL。更重要的是其作者对http协议的深入理解、严谨的代码风格值得吾辈学习、研究。这也是本人分析其核心代码的一大原因。<pre><br />/**<br /> * 实现了连接逻辑。<br /> * 调用者可以在分离的线程中使用netConnection类的静态连接。<br /> * @throws IllegalStateException 如果此方法直接其它类调用则抛出该异常<br /> */<br />public void run() {<br />        <br />        if (url == null) {<br />                throw new IllegalStateException("Cannot invoke this method!");<br />        }<br /><br />        <br />        DataOutputStream dos = null;<br />        DataInputStream dis = null;<br />        StringBuffer buffer = null;<br /><br />        try {<br /><br />                int permissions = 0;<br />                <br />                //根据method值，设置Connector的权限（READ/READ_WRITE）<br />                if (HttpConnection.GET.equals(method)) {<br />                        permissions = Connector.READ;<br />                } else if (HttpConnection.POST.equals(method)) {<br />                        permissions = Connector.READ_WRITE;<br />                }<br />                <br />                //如果关闭server代理功能，则构造noProxyUrl。<br />                //原理：使用timestamp作为该URL中no-proxy参数值，<br />                //        致使server视其为client发来的新请求。<br />                if (disableProxy) {<br />                        <br />                        boolean hasQueryParams = false;<br />                        <br />                        char[] ca = url.toCharArray();<br />                        //判断原URL中是否含有参数<br />                        for (int loop = 0; loop &lt; url.length(); loop++) {<br />                                <br />                                if (ca[loop] == '?') {<br />                                        hasQueryParams = true;<br />                                        break;<br />                                }<br />                        }<br />                        <br />                        //由于需要多次字符串拼接，所以使用可提供效率的StringBuffer类<br />                        StringBuffer noProxyUrl = new StringBuffer();<br /><br />                        //将原URL内容复制到noProxyUrl<br />                        noProxyUrl.append(url);<br /><br />                        //如果原URL中含有参数，<br />                        //  则需要在noProxyUrl中增加"&amp;"，<br />                        //  否则直接在noProxyUrl中增加"?"，<br />                        //  这样做为了后面增加no-proxy参数做准备。<br />                        if (hasQueryParams) {<br />                                noProxyUrl.append("&amp;");<br />                        } else {<br />                                noProxyUrl.append("?");<br />                        }<br /><br />                        //增加no-proxy参数<br />                        noProxyUrl.append("no-proxy=");<br />                        noProxyUrl.append(System.currentTimeMillis()); // timestamp<br />                        <br />                        //将构造好的noProxyUrl复制到原URL<br />                        url = noProxyUrl.toString();<br />                }<br />                <br />                <br /><br />                // 打开Http 连接<br />                httpConn = (HttpConnection) Connector.open(url, permissions, true);<br />                //设置request方法<br />                httpConn.setRequestMethod(method);<br /><br />                //如果request权限为READ（即request方法为GET），<br />                //则需要设置http request属性的Range。<br />                //原理：设置http request属性的Range后的，<br />                //        server接收到该request后将把response数据分成小部分发回。<br />                //        从而避免了部分运营商对http response size的限制。<br />                if (permissions == Connector.READ) {        <br />                        if (lowRange &gt; -1 &amp;&amp; lowRange &lt; highRange) {<br />                                StringBuffer range = new StringBuffer();<br />                                <br />                                range.append("bytes=");<br />                                range.append(lowRange);<br />                                range.append("-");<br />                                range.append(highRange);<br />                                <br />                                httpConn.setRequestProperty("Range", range.toString());<br />                        }<br />                //否则，request权限为READ_WRITE（即request方法为POST），<br />                //那么设置request的Content-Type属性。<br />                } else if (permissions == Connector.READ_WRITE) {<br />                        // POST request<br />                        httpConn.setRequestProperty("Content-Type", contentType);<br />                        dos = httpConn.openDataOutputStream();<br />                        dos.write(data);<br />                }<br />        <br />        } catch (Exception e) {<br />        <br />                exceptionPipe = e;<br />                //如果程序运行在多线程模式，则在异常发生后需要唤醒其它睡眠的线程继续run<br />                if (detached) {<br />                        forceNotify();<br />                }<br />                <br />                return;<br />                <br />        } finally {<br /><br />                try {<br />                        try {<br />                                if (dos != null) {<br />                                        // 关闭dos<br />                                        dos.close();<br />                                }<br />                        } catch (Exception e) {<br />                                // 如果程序运行在多线程模式，则在异常发生后需要唤醒其它睡眠的线程继续run<br />                                if (exceptionPipe == null) {<br />                                        exceptionPipe = e;<br />                                        <br />                                        if (detached) {<br />                                                forceNotify();<br />                                        }<br />                                        return;<br />                                }<br />                        } finally {<br />                                dos = null;<br />                        }<br />                        <br />                        // 读取http连接的回应代码<br />                        int responseCode = httpConn.getResponseCode();<br />                        <br />                        //当request方法为GET，并设置了request range时，接收到的回应代码为HTTP_PARTIAL<br />                        //当request方法为POST，接收到的回应代码为HTTP_OK<br />                        //如果上述两种回应代码均没有收到，则表明连接失败或者出问题<br />                        if (responseCode != HttpConnection.HTTP_OK<br />                                        &amp;&amp; responseCode != HttpConnection.HTTP_PARTIAL) {<br /><br />                                if (exceptionPipe == null) {<br />                                        StringBuffer errorCode = new StringBuffer();<br />                                        errorCode.append("Response code from server: ");<br />                                        errorCode.append(responseCode);<br />                                        errorCode.append("\nMessage: [");<br />                                        errorCode.append(httpConn.getResponseMessage());<br />                                        errorCode.append("]");<br />                                        <br />                                        exceptionPipe = new IOException(errorCode.toString());<br />                                        <br />                                        if (detached) {<br />                                                forceNotify();<br />                                        }<br />                                        return;<br />                                }<br />                        }<br /><br />                        //如果收到了上述的两种回应代码之一，则可以继续读取server的response数据<br />                        dis = httpConn.openDataInputStream();<br /><br />                        //循环读取repsonse数据<br />                        int ch;<br />                        buffer = new StringBuffer();<br />                while ((ch = dis.read()) != -1) {<br />                        buffer.append((char) ch);<br />                }<br /><br />                //将response数据进行必要的编码转换                 <br />                        response = buffer.toString().getBytes("ISO8859_1");<br />                        //接收到回应后，表明整个http会话过程结束，线程将结束。<br />                        //如果程序运行在多线程模式，则此时需要唤醒其它睡眠的线程继续run<br />                        if (detached) {<br />                                forceNotify();<br />                        }<br />                        <br />                        return;<br /><br />                } catch (Exception e) {<br />                        <br />                        if (exceptionPipe == null) {<br />                                exceptionPipe = e;<br />                                <br />                                if (detached) {<br />                                        forceNotify();<br />                                }<br />                                <br />                                return;<br />                        }<br />                } finally {<br />                    <br />                        try {<br />                                if (dis != null) {<br />                                        // 关闭dis<br />                                        dis.close();<br />                                }<br />                        } catch (Exception e) {<br />                                // 若关闭dis时发生异常，则进行异常处理<br />                                if (exceptionPipe == null) {<br />                                        exceptionPipe = e;<br />                                        <br />                                        if (detached) {<br />                                                forceNotify();<br />                                        }<br />                                        return;<br />                                }<br />                        } finally {<br />                                dis = null;<br />                        }<br />                        <br />                        try {<br />                                if (httpConn != null) {<br />                                        //关闭http连接<br />                                        httpConn.close();<br /><br />                                        httpConn = null;<br />                                }<br />                        } catch (Exception e) {<br /><br />                                if (exceptionPipe == null) {<br />                                        exceptionPipe = e;<br />                                        <br />                                        if (detached) {<br />                                                forceNotify();<br />                                        }<br />                                        return;<br />                                }<br />                        }<br />                }<br />        }<br />}<br /></pre><br />五、参考资料：<br /><a href="http://jay-f.jp/devcorner/"><u>联系netConnection作者：JAY-F</u></a><br /><a href="http://jay-f.jp/devcorner/netconnection.zip"><u>源代码下载</u></a><br /><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html"><u>HTTP/1.1定义</u></a><img src ="http://www.blogjava.net/wiser/aggbug/104492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-17 18:00 <a href="http://www.blogjava.net/wiser/archive/2007/03/17/104492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MIME内容类型列表</title><link>http://www.blogjava.net/wiser/archive/2007/03/17/104420.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Sat, 17 Mar 2007 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/17/104420.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104420.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/17/104420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104420.html</trackback:ping><description><![CDATA[
		<h6>MIME类型列表</h6>
		<p>Mime-Typ Dateiendung(en) Bedeutung <br />application/acad *.dwg AutoCAD-Dateien (nach NCSA) <br />application/applefile AppleFile-Dateien <br />application/astound *.asd *.asn Astound-Dateien <br />application/dsptype *.tsp TSP-Dateien <br />application/dxf *.dxf AutoCAD-Dateien (nach CERN) <br />application/futuresplash *.spl Flash Futuresplash-Dateien <br />application/gzip *.gz GNU Zip-Dateien <br />application/listenup *.ptlk Listenup-Dateien <br />application/mac-binhex40 *.hqx Macintosh Binär-Dateien <br />application/mbedlet *.mbd Mbedlet-Dateien <br />application/mif *.mif FrameMaker Interchange Format Dateien <br />application/msexcel *.xls *.xla Microsoft Excel Dateien <br />application/mshelp *.hlp *.chm Microsoft Windows Hilfe Dateien <br />application/mspowerpoint *.ppt *.ppz *.pps *.pot Microsoft Powerpoint Dateien <br />application/msword *.doc *.dot Microsoft Word Dateien <br />application/octet-stream *.bin *.exe *.com *.dll *.class Ausführbare Dateien <br />application/oda *.oda Oda-Dateien <br />application/pdf *.pdf Adobe PDF-Dateien <br />application/postscript *.ai *.eps *.ps Adobe Postscript-Dateien <br />application/rtc *.rtc RTC-Dateien <br />application/rtf *.rtf Microsoft RTF-Dateien <br />application/studiom *.smp Studiom-Dateien <br />application/toolbook *.tbk Toolbook-Dateien <br />application/vocaltec-media-desc *.vmd Vocaltec Mediadesc-Dateien <br />application/vocaltec-media-file *.vmf Vocaltec Media-Dateien <br />application/x-bcpio *.bcpio BCPIO-Dateien <br />application/x-compress *.z -Dateien <br />application/x-cpio *.cpio CPIO-Dateien <br />application/x-csh *.csh C-Shellscript-Dateien <br />application/x-director *.dcr *.dir *.dxr -Dateien <br />application/x-dvi *.dvi DVI-Dateien <br />application/x-envoy *.evy Envoy-Dateien <br />application/x-gtar *.gtar GNU tar-Archiv-Dateien <br />application/x-hdf *.hdf HDF-Dateien <br />application/x-httpd-php *.php *.phtml PHP-Dateien <br />application/x-javascript *.js serverseitige JavaScript-Dateien <br />application/x-latex *.latex Latex-Quelldateien <br />application/x-macbinary *.bin Macintosh Binärdateien <br />application/x-mif *.mif FrameMaker Interchange Format Dateien <br />application/x-netcdf *.nc *.cdf Unidata CDF-Dateien <br />application/x-nschat *.nsc NS Chat-Dateien <br />application/x-sh *.sh Bourne Shellscript-Dateien <br />application/x-shar *.shar Shell-Archiv-Dateien <br />application/x-shockwave-flash *.swf *.cab Flash Shockwave-Dateien <br />application/x-sprite *.spr *.sprite Sprite-Dateien <br />application/x-stuffit *.sit Stuffit-Dateien <br />application/x-supercard *.sca Supercard-Dateien <br />application/x-sv4cpio *.sv4cpio CPIO-Dateien <br />application/x-sv4crc *.sv4crc CPIO-Dateien mit CRC <br />application/x-tar *.tar tar-Archivdateien <br />application/x-tcl *.tcl TCL Scriptdateien <br />application/x-tex *.tex TEX-Dateien <br />application/x-texinfo *.texinfo *.texi TEXinfo-Dateien <br />application/x-troff *.t *.tr *.roff TROFF-Dateien (Unix) <br />application/x-troff-man *.man *.troff TROFF-Dateien mit MAN-Makros (Unix) <br />application/x-troff-me *.me *.troff TROFF-Dateien mit ME-Makros (Unix) <br />application/x-troff-ms *.me *.troff TROFF-Dateien mit MS-Makros (Unix) <br />application/x-ustar *.ustar tar-Archivdateien (Posix) <br />application/x-wais-source *.src WAIS Quelldateien <br />application/x-www-form-urlencoded HTML-Formulardaten an CGI <br />application/zip *.zip ZIP-Archivdateien <br />audio/basic *.au *.snd Sound-Dateien <br />audio/echospeech *.es Echospeed-Dateien <br />audio/tsplayer *.tsi TS-Player-Dateien <br />audio/voxware *.vox Vox-Dateien <br />audio/x-aiff *.aif *.aiff *.aifc AIFF-Sound-Dateien <br />audio/x-dspeeh *.dus *.cht Sprachdateien <br />audio/x-midi *.mid *.midi MIDI-Dateien <br />audio/x-mpeg *.mp2 MPEG-Dateien <br />audio/x-pn-realaudio *.ram *.ra RealAudio-Dateien <br />audio/x-pn-realaudio-plugin *.rpm RealAudio-Plugin-Dateien <br />audio/x-qt-stream *.stream -Dateien <br />audio/x-wav *.wav Wav-Dateien <br />drawing/x-dwf *.dwf Drawing-Dateien <br />image/cis-cod *.cod CIS-Cod-Dateien <br />image/cmu-raster *.ras CMU-Raster-Dateien <br />image/fif *.fif FIF-Dateien <br />image/gif *.gif GIF-Dateien <br />image/ief *.ief IEF-Dateien <br />image/jpeg *.jpeg *.jpg *.jpe JPEG-Dateien <br />image/tiff *.tiff *.tif TIFF-Dateien <br />image/vasa *.mcf Vasa-Dateien <br />image/vnd.wap.wbmp *.wbmp Bitmap-Dateien (WAP) <br />image/x-freehand *.fh4 *.fh5 *.fhc Freehand-Dateien <br />image/x-portable-anymap *.pnm PBM Anymap Dateien <br />image/x-portable-bitmap *.pbm PBM Bitmap Dateien <br />image/x-portable-graymap *.pgm PBM Graymap Dateien <br />image/x-portable-pixmap *.ppm PBM Pixmap Dateien <br />image/x-rgb *.rgb RGB-Dateien <br />image/x-windowdump *.xwd X-Windows Dump <br />image/x-xbitmap *.xbm XBM-Dateien <br />image/x-xpixmap *.xpm XPM-Dateien <br />message/external-body Nachricht mit externem Inhalt <br />message/http HTTP-Headernachricht <br />message/news Newsgroup-Nachricht <br />message/partial Nachricht mit Teilinhalt <br />message/rfc822 Nachricht nach RFC 1822 <br />model/vrml *.wrl Visualisierung virtueller Welten <br />multipart/alternative mehrteilige Daten gemischt <br />multipart/byteranges mehrteilige Daten mit Byte-Angaben <br />multipart/digest mehrteilige Daten / Auswahl <br />multipart/encrypted mehrteilige Daten verschlüsselt <br />multipart/form-data mehrteilige Daten aus HTML-Formular (z.B. File-Upload) <br />multipart/mixed mehrteilige Daten gemischt <br />multipart/parallel mehrteilige Daten parallel <br />multipart/related mehrteilige Daten / verbunden <br />multipart/report mehrteilige Daten / Bericht <br />multipart/signed mehrteilige Daten / bezeichnet <br />multipart/voice-message mehrteilige Daten / Sprachnachricht <br />text/comma-separated-values *.csv komma-separierte Datendateien <br />text/css *.css CSS Stylesheet-Dateien <br />text/html *.htm *.html *.shtml -Dateien <br />text/javascript *.js JavaScript-Dateien <br />text/plain *.txt reine Textdateien <br />text/richtext *.rtx Richtext-Dateien <br />text/rtf *.rtf Microsoft RTF-Dateien <br />text/tab-separated-values *.tsv tabulator-separierte Datendateien <br />text/vnd.wap.wml *.wml WML-Dateien (WAP) <br />application/vnd.wap.wmlc *.wmlc WMLC-Dateien (WAP) <br />text/vnd.wap.wmlscript *.wmls WML-Scriptdateien (WAP) <br />application/vnd.wap.wmlscriptc *.wmlsc WML-Script-C-dateien (WAP) <br />text/xml-external-parsed-entity extern geparste XML-Dateien <br />text/x-setext *.etx SeText-Dateien <br />text/x-sgml *.sgm *.sgml SGML-Dateien <br />text/x-speech *.talk *.spc Speech-Dateien <br />video/mpeg *.mpeg *.mpg *.mpe MPEG-Dateien <br />video/quicktime *.qt *.mov Quicktime-Dateien <br />video/vnd.vivo *viv *.vivo Vivo-Dateien <br />video/x-msvideo *.avi Microsoft AVI-Dateien <br />video/x-sgi-movie *.movie Movie-Dateien <br />workbook/formulaone *.vts *.vtts FormulaOne-Dateien <br />x-world/x-3dmf *.3dmf *.3dm *.qd3d *.qd3 3DMF-Dateien <br />x-world/x-vrml *.wrl VRML-Dateien</p>
<img src ="http://www.blogjava.net/wiser/aggbug/104420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-17 12:28 <a href="http://www.blogjava.net/wiser/archive/2007/03/17/104420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Motorola J2ME开发的几个细节问题</title><link>http://www.blogjava.net/wiser/archive/2007/03/16/104317.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Fri, 16 Mar 2007 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/16/104317.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104317.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/16/104317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104317.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104317.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<p>[转载于cnjm]</p>
		<p>
				<a href="http://www.cnjm.net/tech/article960.html">http://www.cnjm.net/tech/article960.html</a>
		</p>
		<p>
				<br />在实际开发MOTO的产品的时候，会遇到一些细节问题。很烦人，但是往往难到不少人。下面就是我从自己实际开发经历中获得的一些问题的解决。<br />1. Motorola V系列的J2ME的图标显示<br />Motorola的V系列手机j2me程序图标大小必须是15*15的大小.而且必须在MIDlet-Icon中填出图标名字.不能只在MIDlet-1中填写.Nokia的手机的确只填写这里就可以了.</p>
		<p>2. 存储空间的限制问题<br />Motorola的手机的RMS存储空间如果不在MIDlet-Data-Size中具体给出,那么默认的就只有8K还是12K,我记不清楚了。所以，必须再MIDlet-Data-Size中给出具体的RMS需要大小。一般MOTO的手机，最大支持64K的RMS空间。<br />3.Motorola的网络下载问题<br />在中国卖的MOTO的手机，网络连接点都是默认固定到CMWAP上的。所以，一般的J2ME网络连接的方法，是无法通过CMWAP的网关的。解决的办法有两个。<br />1）更改手机上的连接点。其实你只要自己随便建立一个新的连接点，什么信息都不用填写，然后将默认的连接点设置在上面，它就可以自动成为CMNET连接点。那么一般的J2ME网络访问方式就可以了。<br />2）采用CMWAP的连接方式。这个就要求程序上有所改动了。<br />比如我要下载这样一个数据文件: http://211.136.87.234/1.png<br />那么其代码方式就是:<br />c= (HttpConnection)Connector.open("http://10.0.0.172:80/1.png,Connector.READ,true);<br />c.setRequestProperty("X-Online-Host", "211.136.87.234");<br />c.setRequestProperty("Accept", "*/*");<br />is = c.openInputStream();<br />10.0.0.172是移动的CMWAP网关。 </p>
		<p>4.使用WTK104打包的时候没有MIDP2.0的支持. </p>
		<p>移动的百宝箱的测试的时候，建议最好使用WTK打包，这样，CLASS文件调用的API最纯净。但是MOTO的手机大部分都是MIDP2.0的，而WTK104只支持MIDP1.0。打包的时候会出现错误。<br />解决的办法和NOKIA的一样。手动把几个MIDP2.0的API加到WTK里面的lib\midpapi.zip和wtklib\emptyapi.zip里面。用WinRar软件，直接从MOTO的SDK中，拖进去就可以了。</p>
<img src ="http://www.blogjava.net/wiser/aggbug/104317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-16 17:38 <a href="http://www.blogjava.net/wiser/archive/2007/03/16/104317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转贴：关于CMNET，CNWAP的J2ME联网方式</title><link>http://www.blogjava.net/wiser/archive/2007/03/16/104316.html</link><dc:creator>英明</dc:creator><author>英明</author><pubDate>Fri, 16 Mar 2007 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/wiser/archive/2007/03/16/104316.html</guid><wfw:comment>http://www.blogjava.net/wiser/comments/104316.html</wfw:comment><comments>http://www.blogjava.net/wiser/archive/2007/03/16/104316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiser/comments/commentRss/104316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiser/services/trackbacks/104316.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<p>原作：<a href="http://www.javaeye.com/topic/44418">http://www.javaeye.com/topic/44418</a>     作者：<b>wuhua</b></p>
		<p>
		</p>
		<p>在j2medev上见到一篇关于<a href="http://www.j2medev.com/Article/Class1/Class14/200512/1090.html">CMNET和CMWAP网络连接</a>。   现在我根据我的实际经验总结下它们。<br />1。CMNET，这个就不用怎么样介绍了，跟电脑上Internet没什么区别。<br />直接用这个这样的代码就Ok了 
</p>
		<p>java 代码 
</p>
		<ol>
				<li>try {   
</li>
				<li>             http = (HttpConnection) Connector.open(url);   
</li>
				<li>        } catch (IOException e) {   
</li>
				<li>
				</li>
				<li>            e.printStackTrace();   
</li>
				<li>}  </li>
		</ol>
		<p>2。CNWAP，这个我的实践结果根网上的很多介绍不同。看下面这段文字。下面摘自。<a href="http://blog.sina.com.cn/u/465a49f5010002cf">在J2ME中使用CNWAP接入点联网</a></p>
		<p>都是中国移动搞出来的事情。 
</p>
		<p>所以对于特定的一些机型，普通的直接联网方式会出现连不上网络，这是因为你的手机设备不支持CMNET的联网方式。也许你会发现不经过修改，直接连接的方式也可以在一些cnwap的设备上（只支持cnwap的多为低端机）运行，这个是因为设备上应中国一定的要求，在系统底层进行了转换，如果没有转换的话，就必须你自己手动在代码里面显式的来转换了。 
</p>
		<p>这里我只打算给出一些示意代码，用来辅助说明解决问题的方法 
</p>
		<p>假设你原来要请求的页面是：htpp://www.testwap.com/test/try.jsp 
</p>
		<p>那么你会用这句话连接 
</p>
		<p>HttpConnection httpConnection = (HttpConnection)Connector.open(“http://www.testwap.com/test/try.jsp”); 
</p>
		<p>但是为了转成CNWAP的联网形式 你必须这么写 
</p>
		<p>HttpConnection httpConnection = (HttpConnection)Connector.open(“http://10.0.0.172:80/test/try.jsp”); 
</p>
		<p>接着再写 
</p>
		<p>httpConnection.setRequestProperty("X-Online-Hostwww.testwap.com");<br />httpConnection.setRequestProperty("Accept","*/*");  
</p>
		<p>这样就ok了 
</p>
		<p>不过这个方法在模拟器上没办法测试，因为模拟器移动网关不让你进啊，所以写代码的时候用cmnet的正式发布的时候改成cnwap的。很麻烦<br />代码是 
</p>
		<p>java 代码 
</p>
		<ol>
				<li>http =(HttpConnection)Connector.open("http://10.0.0.172:80/"+url,Connector.READ,true);   
</li>
				<li>
				</li>
				<li>     c.setRequestProperty("X-Online-Host",ServerName);   
</li>
				<li>
				</li>
				<li>     c.setRequestProperty("Accept", "*/*");  </li>
		</ol>
		<p>上面的代码CMNET我试过，因为我那个足球项目需要采用Scoket，确实是只有CMNET能打开Socket。<br />第二种，我却意外发现，我开发WapExporer进行测试的时候，我没有采用代理，也可以获取连接。<br />分析有以下几种可能。<br />1.移动那边可能对于CMNET来说，几乎是对所有的协议进行开放。比如（Socket，Http）跟所有端口。<br />2.对于CNWAP，我估计只开放http协议以及80端口，其他的都封闭，也就是CNWAP只能访问http协议。<br />   由于我测试的IP地址进行测试，所以它可以直接找到。对于非IP地址我没测试果。也许CNWAP不能解释域名也说不定，这点我就不清楚了。</p>
<img src ="http://www.blogjava.net/wiser/aggbug/104316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiser/" target="_blank">英明</a> 2007-03-16 17:34 <a href="http://www.blogjava.net/wiser/archive/2007/03/16/104316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>