天天看点

翻译Sun帮助文件——javax.wireless.messaging(MessageListener)

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。

继续阅读