javax.wireless.messaging
Interface MessageListener
MessageListener接口提供了一个可使程序在有信息到来时得到通知的机制。
当有信息到来时,notifyIncomingMessage()将被调用。程序必须用MessageConnection的receive()方法接收信息。MessageListener却不应直接调用receive(),而应该使用一个新的线程,或调用一个不在此接口内部实现的方法来间接地调用receive()。比如下面一个简单的MessageListener实现将展示如何使用MessageListener。
此接口提供的机制使得程序不需要在receive()方法中将线程挂起。
如果有不止一个信息在接近的时刻到达,此接口的实现将可能被同步地被通知。程序必须同步某些部分以处理上述情况。
__________________________________________________________________________
简单的MessageListener实现
以下的代码展示了如何使用MessageListener。在这个例子中一个独立的线程被用来处理信息的接收。
import java.io.IOException;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;
public class Example extends MIDlet implements MessageListener {
MessageConnection messconn;
boolean done;
Reader reader;
//初始化
public void startApp() {
try {
// 建立连接
messconn = (MessageConnection)
Connector.open("sms://:6222");
// 注册listener
messconn.setMessageListener(this);
/ / 建立接受信息的线程
done = false;
reader = new Reader();
new Thread(reader).start();
} catch (IOException e) {
// 处理错误
}
}
// 同步
public void notifyIncomingMessage(MessageConnection conn) {
if (conn == messconn) {
reader.handleMessage();
}
}
// 关闭连接
// 停止线程
public void pauseApp() {
done = true;
try {
messconn.close();
} catch (IOException e) {
//处理错误
}
}
// MIDlet 停止
// @param unconditional forced shutdown flag
public void destroyApp(boolean unconditional) {
done = true;
try {
messconn.setMessageListener(null);
messconn.close();
} catch (IOException e) {
// 错误处理
}
}
//用另外的线程处理信息接收则
// notifyIncomingMessage()可以很快返回
class Reader implements Runnable {
private int pendingMessages = 0;
// 处理接收信息的实际工作
public void run() {
while (!done) {
synchronized(this) {
if (pendingMessages == 0) {
try {
wait();
} catch (Exception e) {
// 处理错误
}
}
pendingMessages--;
}
// 使用的MessageListener好处
// 这个线程可由同样的机制激活
// 来处理别的事件
//而不仅是接收信息
try {
Message mess = messconn.receive();
} catch (IOException ioe) {
// 处理错误
}
}
}
public synchronized void handleMessage() {
pendingMessages++;
notify();
}
}
}
________________________________________________________________________
Method Detail
notifyIncomingMessage
public void notifyIncomingMessage(MessageConncetion conn)
当由信息到来是由系统调用,并且每一条信息都将引发此方法被调用。
提示:
此方法的实现必须快速的返回,不应做任何不必要的操作。程序不应该在此方法中接收或处理信息。它只应激发
程序处理信息的线程。
Parameters:
conn:信息抵达的MessageConnction。