多线程技术是JAVA ME中的关键技术应用十分频繁尤其是在游戏中但是对于新手来说又容易忽略或错误的使用多线程导致程序堵塞而无法响应用户的输入请求
由于笔者对于游戏开发不是十分了解所以本文将仅就多线程技术在JAVA ME应用程序中的使用展开讨论本文主要包含如下部分
多线程与联网
多线程与拍照
Timer与TimerTask
多线程与联网
手机中所有的MIDlet程序都是由Application Manager Software(AMS)管理的当MIDlet初始化后AMS就会调用MIDlet的startApp()方法此时MIDlet就进入了Acitive状态在JAVA ME中有些操作可能会导致程序堵塞比如连接网络等如果这些操作与主程序在同一个主线程中完成那么由于堵塞会造成程序长时间无法返回也就无法响应用户的其他操作了所以如果我们在commandAction()中进行了联网的操作则会造成如上所述的情况
下面将通过一个例子来演示如上的情况并使用多线程最终解决此问题这是一个Echo Message实例手机端向服务器端发送一条消息服务器得到此消息后直接返回给手机端
首先创建一个NetworkConnection类来封装联网相关的操作这样MIDlet中只需调用此类中的方法就可以完成联网的操作代码如下
以下是引用片段
/*
*NetworkConnectionjava
*
*Createdon年月日下午:
*
*/
packagenjunnection;
importjavaioDataInputStream;
importjavaioDataOutputStream;
importjavaioIOException;
importjavaxmicroeditionioConnector;
importjavaxmicroeditionioHttpConnection;
/**
*
*@authorMagic
*/
publicclassNetworkConnection{
privatestaticfinalStringURL=//localhost:/thread/;
privateHttpConnectionhttpConnection;
privateStringmessage;
publicNetworkConnection(Stringmessage){
ssage=message;
connect();
}
/**
*Connecttowebserver
*
*/
publicvoidconnect(){
try{
httpConnection=(HttpConnection)Connectoropen(URL);
(HttpConnectionPOST);
}catch(IOExceptionex){
Systemoutprintln(Cannotopenconnection!);
exprintStackTrace();
}
}
/**
*Sendmessagetoserver
*@throwsjavaioIOException
*/
publicvoidsendMessage()throwsIOException{
DataOutputStreamout=();
outwriteUTF(message);
outclose();
}
/**
*Receivemessagefromserver
*@throwsjavaioIOException
*@return
*/
publicStringreceiveMessage()throwsIOException{
DataInputStreamin=();
Stringmessage=inreadUTF();
inclose();
returnmessage;
}
/**
*Closeconnection
*/
publicvoidclose(){
if(httpConnection!=null){
try{
();
}catch(IOExceptionex){
exprintStackTrace();
}
}
}
} 构造函数的参数是将要被发送的消息服务器端的代码在此不再列出详细请见本文的源代码
接着我们写一个MIDlet调用类中的方法MalConnectionMidlet在commandAction()方法中直接调用NetworkConnection中的方法而没有重新创建一个线程代码如下
以下是引用片段
/*
*MalConnectionMidletjava
*
*Createdon年月日下午:
*/
packagenjunnection;
importjavaioIOException;
importjavaxmicroeditionmidlet*;
importjavaxmicroeditionlcdui*;
/**
*
*@authorMagic
*@version
*/
publicclassMalConnectionMidletextendsMIDletimplementsCommandListener{
privateDisplaydisplay;
privateTextBoxtext;
privateCommandshowCommand;
publicMalConnectionMidlet(){
display=DisplaygetDisplay(this);
text=newTextBox(Message请使用问候命令发送消息TextFieldANY);
showCommand=newCommand(问候CommandSCREEN);
textaddCommand(showCommand);
textsetCommandListener(this);
}
publicvoidstartApp(){
displaysetCurrent(text);
}
publicvoidpauseApp(){
}
publicvoiddestroyApp(booleanunconditional){
}
publicvoidcommandAction(CommandcommandDisplayabledisplayable){
if(command==showCommand){
/**
*在当前的线程中直接进行联网操作造成程序堵塞
*/
Stringmessage=null;
NetworkConnectionconnection=newNetworkConnection(HelloWorld);
try{
connectionsendMessage();
message=connectionreceiveMessage();
connectionclose();
}catch(IOExceptionex){
exprintStackTrace();
}
textsetString(message);
}
}
} 当用户按下问候命令时就会向服务器发送Hello World的消息然后再得到服务器返回的消息并显示在TextBox中
运行程序如图所示当用户按下问候命令后程序就僵死了并在Console窗口中得到如下警告
图
以下是引用片段
Warning:Toavoidpotentialdeadlockoperationsthatmayblocksuchas
networkingshouldbeperformedinadifferentthreadthanthe
commandAction()handler
这就是因为没有使用多线程造成的下面就来看看如何使用多线程来解决此问题