WEB开发网
开发学院WEB开发Jsp 多线程在JAVA ME应用程序中的使用 阅读

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

 2008-01-05 19:18:38 来源:WEB开发网   
核心提示: 多线程技术是java ME中的要害技术,应用十分频繁,多线程在JAVA ME应用程序中的使用,尤其是在游戏中,但是对于新手来说,我们写一个MIDlet调用类中的方法,MalConnectionMidlet在commandAction()方法中直接调用NetworkConnection中的方法,又轻易忽略或错误的使用

   多线程技术是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中的方法,而没有重新创建一个线程。代码如下:


Tags:线程 JAVA ME

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接