多线程在JAVA ME应用程序中的使用

王朝java/jsp·作者佚名  2008-05-31
宽屏版  字体: |||超大  

多线程技术是Java ME中的要害技术,应用十分频繁,尤其是在游戏中。但是对于新手来说,又轻易忽略或错误的使用多线程,导致程序堵塞,而无法响应用户的输入请求。

由于笔者对于游戏开发不是十分了解,所以本文将仅就多线程技术在JAVA ME应用程序中的使用展开讨论。本文主要包含如下部分:

多线程与联网

多线程与拍照

Timer与TimerTask

多线程与联网

手机中,所有的MIDlet程序都是由Application Manager Software(AMS)治理的。当MIDlet初始化后,AMS就会调用MIDlet的startApp()方法,此时MIDlet就进入了Acitive状态。在JAVA ME中有些操作可能会导致程序堵塞,比如连接网络等。假如这些操作与主程序在同一个主线程中完成,那么由于堵塞会造成程序长时间无法返回,也就无法响应用户的其他操作了。所以,假如我们在commandAction()中进行了联网的操作,则会造成如上所述的情况。

下面,将通过一个例子来演示如上的情况,并使用多线程最终解决此问题。这是一个“Echo Message”实例,手机端向服务器端发送一条消息,服务器得到此消息后直接返回给手机端。

首先,创建一个NetworkConnection类来封装联网相关的操作,这样,MIDlet中只需调用此类中的方法就可以完成联网的操作。代码如下:

以下是引用片段:

/*

* NetworkConnection.java

*

* Created on 2006年7月20日, 下午2:54

*

*/

package nju.hysteria.thread.connection;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import javax.microedition.io.Connector;

import javax.microedition.io.HttpConnection;

/**

*

* @author Magic

*/

public class NetworkConnection {

private static final String URL = "http://localhost:8080/thread/";

private HttpConnection httpConnection;

private String message;

public NetworkConnection(String message) {

this.message = message;

connect();

}

/**

* Connect to web server.

*

*/

public void connect(){

try {

httpConnection = (HttpConnection) Connector.open(URL);

httpConnection.setRequestMethod(HttpConnection.POST);

} catch (IOException ex) {

System.out.println("Can not open connection!");

ex.printStackTrace();

}

}

/**

* Send message to server.

* @throws java.io.IOException

*/

public void sendMessage() throws IOException{

DataOutputStream out = httpConnection.openDataOutputStream();

out.writeUTF(message);

out.close();

}

/**

* Receive message from server.

* @throws java.io.IOException

* @return

*/

public String receiveMessage() throws IOException {

DataInputStream in = httpConnection.openDataInputStream();

String message = in.readUTF();

in.close();

return message;

}

/**

* Close connection.

*/

public void close(){

if(httpConnection!=null){

try {

httpConnection.close();

} catch (IOException ex) {

ex.printStackTrace();

}

}

}

}

构造函数的参数是将要被发送的消息。服务器端的代码在此不再列出,具体请见本文的源代码。

接着,我们写一个MIDlet调用类中的方法。MalConnectionMidlet在commandAction()方法中直接调用NetworkConnection中的方法,而没有重新创建一个线程。代码如下:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有