- 浏览: 335803 次
- 性别:
- 来自: 温州
文章分类
最新评论
-
helloworldlove:
Axis_UNZIP_PATH\Axis-version\we ...
3步把您的java程序转换为webservice -
hcqenjoy:
这个工具能再提供下吗 已经没办法下载了 谢谢
汉化 Flex Builder 3 帮助文档 -
NASa_CJ:
String source = HttpClientExamp ...
利用HttpClient获取网页内容 -
zlsj80:
下载地址无效了,楼主修正一下吧
汉化 Flex Builder 3 帮助文档 -
fykyx521:
下载地址都不能用了,是不过时了
汉化 Flex Builder 3 帮助文档
线程在J2ME开发中是不可或缺的一部分,J2ME继承了J2SE中关于java.lang中的Runnable接口,以及Thread类。但是,由于J2ME应用的特殊性,J2ME<o:p></o:p>
程序中去除了部分API,没有线程组的概念,也没有daemon线程。<o:p></o:p>
今天,我们从一个例子出发,来学习J2ME当中的线程的概念。我们选取的例子是俄罗斯方块。首先,有一些要注意的事项:<o:p></o:p>
1.注意一点,要注意在J2me中不要使用浮点数,这样可以通过编译,但是不能通过预验证。因为一般手持设备都无法负担浮点运算的高负荷。<o:p></o:p>
2.在J2ME程序当中,绝大多数的空间为图片所占有,我们可以看到,今天我们的例子没有任何图片,仅仅5k,如果是开发产品,不可避免的要使用图片,<o:p></o:p>
但是尽量使用压缩率高的png图片,而且不要太过复杂,因为复杂的图片会使得图片变得很大。<o:p></o:p>
3.在程序中尽量使用常量特别是位置信息,这样当作修改的时候只要改一个量就可以了,而且当移植到其他平台的时候也会减少很多工作量.还有就是颜色<o:p></o:p>
信息等.不用每次记忆,重新构造,因为J2me中的颜色和j2se的不太一样.没有常量定义.<o:p></o:p>
4.游戏产品经常需要保护版权,而当今的很多反编译工具可以轻而易举地把jar文件的内容反编译过来,因此可以对程序进行模糊化处理,使得无法反编译<o:p></o:p>
或者反编译后无法理解.可以右键点击项目,在属性中选择Build|Obfuscating,选择模糊化级别.<o:p></o:p>
5.讲解中我们都使用NetBeans作为开发平台,有关安装事宜请访问www.netbeans.org.<o:p></o:p>
<o:p></o:p>
好,我们开始吧。<o:p></o:p>
A. 首先,建立一个新的移动应用程序项目,取名Tetris, 不要自动创建Hello程序,选取MIDP1.0和CLDC1.0.<o:p></o:p>
B. 新建一个包,方法是右键点击项目,选取New|Java Package,取名Tetris.<o:p></o:p>
C. 新建一个Midlet,同上,选取New|Java Midlet, 取名TetrisMidlet.<o:p></o:p>
D. 我们需要一个能够显示游戏的Canvas, 因此新建一个Class名叫TetrisCanvas, 在TetrisMidlet.java中将TetrisCanvas作为当前可以显示的元素:<o:p></o:p>
现在的TetrisMidlet.java如下:<o:p></o:p>
package Tetris;<o:p></o:p>
<o:p></o:p>
import javax.microedition.midlet.*;<o:p></o:p>
import javax.microedition.lcdui.*;<o:p></o:p>
<o:p></o:p>
/**<o:p></o:p>
*<o:p></o:p>
* @author lin<o:p></o:p>
* @version<o:p></o:p>
*/<o:p></o:p>
public class TetrisMidlet extends MIDlet {<o:p></o:p>
public void startApp() {<o:p></o:p>
Display display = Display.getDisplay( this );<o:p></o:p>
// TetrisCanvas extends Canvas which extends Displayable so it can<o:p></o:p>
// be displayed directly<o:p></o:p>
display.setCurrent( new TetrisCanvas());<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
public void pauseApp() {<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
public void destroyApp(boolean unconditional) {<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
由于TetrisCanvas继承了Canvas,所以可以被TetrisMidlet所显示.<o:p></o:p>
E. 这里,我们需要将TetrisCanvas继承Canvas,并且实现Canvas的接口函数paint(),我们现在有了一个TetrisCanvas的框架了。<o:p></o:p>
package Tetris;<o:p></o:p>
<o:p></o:p>
import javax.microedition.lcdui.*;<o:p></o:p>
public class TetrisCanvas extends Canvas {<o:p></o:p>
/** Creates a new instance of TetrisCanvas */<o:p></o:p>
public TetrisCanvas() {<o:p></o:p>
<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
protected void paint(Graphics g){<o:p></o:p>
<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
下面我们需要使得TetrisCanvas具有Thread的特性,这里有两种方法,一种是让TetrisCanvas继承Thread类,然后生成它的实例,但是由于它已经<o:p></o:p>
继承了Canvas类,而Java中不允许多重继承,因此,我们在编程当中通常采取第二种做法,也就是让它实现Runnable接口,在成员中声明一个Thread<o:p></o:p>
成员,实例生成指向自己,然后实现run方法。<o:p></o:p>
<o:p></o:p>
也就是这样:<o:p></o:p>
public class TetrisCanvas extends Canvas implements Runnable {<o:p></o:p>
private Thread Blocker = null;<o:p></o:p>
...<o:p></o:p>
public TetrisCanvas(){<o:p></o:p>
Blocker = new Thread(this);<o:p></o:p>
Blocker.start();<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
...<o:p></o:p>
public void run(){<o:p></o:p>
while (Blocker != null) {<o:p></o:p>
<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
}<o:p></o:p>
...<o:p></o:p>
<o:p> </o:p>
}<o:p></o:p>
F. 程序逻辑:下面给出程序清单。程序中我们使用一个数组来存储方块的信息,一共有十九种,还有一个数组来存储当前的画面方格的内容.在程序中<o:p></o:p>
有一个paint方法来实现重画,注意绘制的先后次序,当程序规模变得很大的时候,重画的效率就非常重要,需要进行优化.我们在程序中使用了背景,<o:p></o:p>
在没有背景的情况下,程序仅5k,采用背景后,程序47k,可见对图片的优化至关重要.<o:p></o:p>
<o:p> </o:p>
/*<o:p></o:p>
* TetrisCanvas.java<o:p></o:p>
*<o:p></o:p>
* Created on 2005年7月13日, 上午11:31<o:p></o:p>
*<o:p></o:p>
* To change this template, choose Tools | Options and locate the template under<o:p></o:p>
* the Source Creation and Management node. Right-click the template and choose<o:p></o:p>
* Open. You can then make changes to the template in the Source Editor.<o:p></o:p>
*/<o:p></o:p>
<o:p></o:p>
package Tetris;<o:p></o:p>
<o:p></o:p>
import java.util.*;<o:p></o:p>
import java.lang.Math;<o:p></o:p>
import javax.microedition.lcdui.*;<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
/**<o:p></o:p>
*<o:p></o:p>
* @author lin<o:p></o:p>
*/<o:p></o:p>
public class TetrisCanvas extends Canvas implements Runnable{<o:p></o:p>
private Thread Blocker = null;<o:p></o:p>
private Random generator;<o:p></o:p>
private int FutureBlockType, BlockType,LastType,LastX,LastY,BlockX,BlockY ;<o:p></o:p>
private int BlockLines,BlockScore;<o:p></o:p>
private int BlockSpeed,CurSpeed;<o:p></o:p>
<o:p></o:p>
private static final int COLOR_GRAY = 0x00eeeeee;<o:p></o:p>
private static final int COLOR_RED = 0x00ff0000;<o:p></o:p>
private static final int COLOR_BLACK = 0x00000000;<o:p></o:p>
private static final int COLOR_WHITE = 0x00ffffff;<o:p></o:p>
private static final int COLOR_BLUE = 0x000000ff;<o:p></o:p>
private static final int COLOR_LIGHT_BLUE= 0x0089a5d1;<o:p></o:p>
private static final int COLOR_DARK_GRAY = 0x00808080;<o:p></o:p>
private static final int COLOR_BACKGROUND= COLOR_LIGHT_BLUE;<o:p></o:p>
<o:p></o:p>
private static final int BLOCK_SIZE = 7;<o:p></o:p>
private static final int CANVAS_SIZE_WIDTH = 12;<o:p></o:p>
private static final int CANVAS_SIZE_HEIGHT = 22;<o:p></o:p>
private static final int CANVAS_OFFSET_X = 5;<o:p></o:p>
private static final int CANVAS_OFFSET_Y = 7;<o:p></o:p>
<o:p></o:p>
/**<o:p></o:p>
* The paint status.<o:p></o:p>
*/<o:p></o:p>
boolean ISCLEAR = false;<o:p></o:p>
boolean ISDOWN = false;<o:p></o:p>
boolean ISDEL = false;<o:p></o:p>
<o:p></o:p>
/**<o:p></o:p>
* the block information matrix.<o:p></o:p>
*/<o:p></o:p>
int BlockInfo[][]={{1,0,1,1,1,2,1,3,0xff0000,2},<o:p></o:p>
{0,1,1,1,2,1,3,1,0xff0000,4},<o:p></o:p>
{0,0,0,1,1,1,1,2,0x0000ff,2},<o:p></o:p>
{0,1,1,0,1,1,2,0,0x0000ff,3},<o:p></o:p>
{0,1,0,2,1,0,1,1,0x00ff00,2},<o:p></o:p>
{0,0,1,0,1,1,2,1,0x00ff00,3}, <o:p></o:p>
{0,0,0,1,1,0,1,1,0xffff00,2},<o:p></o:p>
{0,1,1,0,1,1,1,2,0x00ffff,2},<o:p></o:p>
{0,1,1,0,1,1,2,1,0x00ffff,3},<o:p></o:p>
{1,0,1,1,1,2,2,1,0x00ffff,3},<o:p></o:p>
{0,1,1,1,1,2,2,1,0x00ffff,3},<o:p></o:p>
{0,1,0,2,1,1,2,1,0xff00ff,3},<o:p></o:p>
{0,0,1,0,1,1,1,2,0xff00ff,3},<o:p></o:p>
{0,1,1,1,2,0,2,1,0xff00ff,3},<o:p></o:p>
{1,0,1,1,1,2,2,2,0xff00ff,3},<o:p></o:p>
{0,0,0,1,1,1,2,1,0xffffff,3},<o:p></o:p>
{1,0,1,1,1,2,2,0,0xffffff,3},<o:p></o:p>
{0,1,1,1,2,1,2,2,0xffffff,3},<o:p></o:p>
{0,2,1,0,1,1,1,2,0xffffff,3},<o:p></o:p>
};<o:p></o:p>
// Gridmatrix 中只存储颜色信息<o:p></o:p>
int Gridmatrix[][]=new int[CANVAS_SIZE_HEIGHT][CANVAS_SIZE_WIDTH];<o:p></o:p>
<o:p></o:p>
/**<o:p></o:p>
* Initialize the applet. Resize and load images.<o:p></o:p>
*/<o:p></o:p>
public void init() {<o:p></o:p>
BlockType=Math.abs(generator.nextInt()%19);<o:p></o:p>
FutureBlockType=Math.abs(generator.nextInt()%19);<o:p></o:p>
LastType=BlockType;<o:p></o:p>
<o:p></o:p>
BlockLines=0;<o:p></o:p>
BlockScore=0;<o:p></o:p>
BlockSpeed=1;<o:p></o:p>
CurSpeed=BlockSpeed;<o:p></o:p>
BlockX=4; LastX=BlockX;<o:p></o:p>
BlockY=0; LastY=BlockY;<o:p></o:p>
<o:p></o:p>
//初始化Gridmatrix矩阵,内容为带边框的主绘图区。<o:p></o:p>
for(int i=0;i<CANVAS_SIZE_HEIGHT;i++)<o:p></o:p>
for(int j=0;j<CANVAS_SIZE_WIDTH;j++)<o:p></o:p>
Gridmatrix[i][j]=0;<o:p></o:p>
for(int i=0;i<CANVAS_SIZE_WIDTH;i++) <o:p></o:p>
Gridmatrix[CANVAS_SIZE_HEIGHT-1][i]=COLOR_DARK_GRAY;<o:p></o:p>
for(int i=0;i<CANVAS_SIZE_HEIGHT;i++) {<o:p></o:p>
Gridmatrix[i][0]=COLOR_DARK_GRAY;<o:p></o:p>
Gridmatrix[i][11]=COLOR_DARK_GRAY;<o:p></o:p>
} <o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
/** Creates a new instance of TetrisCanvas */<o:p></o:p>
public TetrisCanvas() {<o:p></o:p>
generator = new Random( System.currentTimeMillis() );<o:p></o:p>
init();<o:p></o:p>
Blocker = new Thread(this);<o:p></o:p>
Blocker.start();<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
发表评论
-
Java 5.0 多线程编程实践
2006-01-23 13:20 771<noscript type="text/ja ... -
web开发框架——JSF开发实战
2006-01-23 20:01 1422JSF开发实战的第一篇(jsf开发实战一)演示了如何建立一个最 ... -
Tomcat 的数据库连接池设置与应用
2006-01-23 20:28 7691.将数据库驱动程序的JAR文件放在Tomcat的 commo ... -
Eclipse Plugins Manager Beta 0.1 (Link's Only) 发布
2006-03-18 17:11 790<noscript type="text/ja ... -
常青图书管理系统 BETA V0.1
2006-03-19 15:03 839<noscript type="text/ja ... -
Java程序的性能优化
2006-03-19 15:15 806<noscript type="text/ja ... -
Java中四种XML解析技术之不完全测试
2006-03-20 12:16 697<noscript type="text/ja ... -
解决Tomcat中文乱码问题
2006-03-26 22:58 866一、中文问题的来源 计算机最初的操作系统支持的编码是单 ... -
Swing技巧. 设置全局字体(sun jdk)
2006-04-02 14:04 1341S ... -
Dom4j 使用简介
2006-04-05 20:19 674DOM4J是dom4j.org出品的一个开源XML解析包 ... -
Java手机技术 之 J2ME及其基本慨念
2006-04-06 12:42 726如果您曾经http://www.javasoft.com ;网 ... -
Java手机技术 之 J2ME新手入门要点
2006-04-06 12:50 1002一、J2ME中需要的Java基础知识现在有大部分人,都是从零开 ... -
JAVA设计模式系列之Singleton模式
2006-04-06 13:18 829单态定义: Singleton模式主要作用是保证在Java应 ... -
高手指点你实战体会Java的多线程编程
2006-04-06 13:39 836在 Java 程序中使用多线程要比在 C 或 C++ 中容 ... -
Java基础--JSP应用语法详解大全
2006-04-06 13:49 9011)HTML注释: 可以用注释内容,也可以用表达式. 2) ... -
javamail使用完全手册
2006-04-08 20:44 8761,哪里是开始:初始环境,安装好你的j2sdk和你的web服务 ... -
JavaMail通过sina的smtp验证
2006-04-08 20:47 1122import javax.mail.*;import java ... -
用javamail发送邮件
2006-04-08 20:49 997用javamail发送邮件 aistill(原作) ... -
修改后可以发送附件、抄送、密送的javabean
2006-04-08 20:51 933/**A ... -
javamail实现smtp身份认证
2006-04-08 20:57 950现在大多 ...
相关推荐
但它们必须在`synchronized`代码块或方法中使用。 三、线程优先级 J2ME中的线程优先级通过`setPriority()`方法设置,有三个级别:`Thread.MIN_PRIORITY`(最低),`Thread.NORM_PRIORITY`(默认),和`Thread.MAX_...
在Java Micro Edition (J2ME)中,线程和网络编程是两个至关重要的概念,尤其对于开发移动设备上的应用程序来说。J2ME为资源有限的设备提供了轻量级的Java平台,因此理解和掌握这两个主题是编写高效、响应式以及能够...
本教程将深入讲解J2ME在手机程序开发中的应用,帮助开发者掌握这一核心技术。 ### J2ME技术概述 J2ME由两大部分构成:配置(Configurations)和框架(Profiles)。配置定义了运行时环境的基本特性,如内存大小和...
在J2ME中,多线程的使用可以实现游戏的流畅运行,例如,一个线程负责游戏的图形渲染,另一个线程则处理用户的输入事件,这样即使在复杂的交互中,游戏画面也不会出现卡顿。 对于新手开发者来说,了解并实践多线程是...
**J2ME API 2.0 - J2ME使用手册 - J2ME帮助文档** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的设备如移动电话、智能手表和家用电器等设计。J2ME API 2.0 提供了在这些小型设备上开发应用...
j2me写的秒表程序,使用多线程,对于初学者是一个很好的例子。。。
MIDP(Mobile Information Device Profile)2.0是J2ME中的一个重要配置,它提供了在这些小型设备上开发应用程序的基本框架和API。本教程将深入探讨如何使用J2ME和MIDP2.0进行移动应用开发。 **1. J2ME架构** J2ME...
1. **合理使用数据结构**:J2ME中的数据结构如ArrayList和Vector在内存管理上不如Java SE高效。考虑使用数组代替ArrayList,避免动态扩容带来的性能开销。对于小规模的数据存储,可以考虑使用哈希表或者简单的数组...
在J2ME中,我们通常使用Canvas类作为画布,绘制游戏的各个元素。Canvas继承自Displayable,允许我们自定义绘制函数,实现游戏画面的更新。例如,在飞机游戏中,我们需要绘制飞机、敌人、子弹以及背景等元素。 事件...
1. J2ME概述: J2ME提供了一个灵活的框架,使开发者能够为各种资源受限的设备编写可移植的应用程序。它由一组配置(Configurations)和 profiles(Profiles)组成,如基础配置(CLDC)和无线信息设备配置(MIDP),...
7. **线程管理**:J2ME的线程模型不同于Android,需要适应Android的AsyncTask或Thread/Handler机制。 8. **性能优化**:Android设备性能各异,移植时需注意内存管理和性能优化,避免在Android上出现J2ME中的性能...
6. **多线程编程**:J2ME中的线程管理对于实现后台任务和提升用户体验至关重要。 7. **网络服务集成**:如XML解析、SOAP通信,以及与Web服务的交互。 8. **资源管理**:在有限的内存和存储条件下,有效地管理和...
1. **J2ME架构**:讲解了J2ME的配置和 profiles,如MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device Configuration),这些都是开发J2ME游戏的基础。 2. **图形和用户界面**:详细介绍...
5. **类与方法**:源码中可能包含对J2ME API的多种使用,如网络通信(利用HttpConnection和DataInputStream/OutputStream进行HTTP请求),文件I/O(FileConnection API),以及线程管理(Thread类)。 6. **事件...
在J2ME中,我们通常使用` javax.microedition.lcdui.ProgressIndicator`接口来实现进度条功能。 实现J2ME进度条通常涉及以下步骤: 1. **创建进度条**:首先,你需要创建一个`ProgressIndicator`实例。可以使用`...
理解如何在J2ME中使用精灵对于创建动态、交互式的用户体验至关重要。 1. **精灵的概念**: - 精灵是一种二维图形对象,可以在游戏场景中独立移动和动画化。它们通常由多个帧组成,通过快速切换帧来创建连续的动作...
2. **事件处理**:J2ME使用键事件和触摸事件(如果设备支持)来处理用户输入,这在游戏控制中至关重要。 3. **线程管理**:游戏通常需要独立于用户界面的线程来实现游戏逻辑和动画,以确保流畅性。 4. **资源管理**...
在J2ME开发过程中,理解和掌握这些工具的使用是至关重要的。它们不仅提高了开发效率,还确保了应用的质量和跨设备的兼容性。随着技术的不断进步,开发者也需要持续学习和适应新的开发工具和技术,以适应不断变化的...
本文将详细介绍如何在Android环境中使用J2ME MIDP 2.0的Game API,特别是四个关键工具类:Layer、LayerManager、Sprite和TiledLayer。 **Layer** 类在MIDP 2.0中是一个基础组件,它代表了一个可绘制的平面层。Layer...
音乐的控制,rms的操作类,java字符串解析 将字符串解析成字符数组,java进度条实例模板,j2me中将对象转换成字节数组的方法,j2me联网测试,j2me多线程的应用实例,j2me Socket通信例子 客户端,服务器端