2013-02-13 77 views
0

我有一个BlackBerry应用程序,它以固定的时间间隔向服务器发送消息。消息通过使用任何可用连接方法的Web服务发送; WIFI,BIS,TCP/IP等。BlackBerry - 从持久对象向量中写入和读取

由于消息是不断发送的,我需要一种机制来排队消息,以防万一互联网不可用,并在互联网可用时发送消息。出于这个原因,我希望首先将任何传出的消息保存在持久存储中,然后读取持久存储,并通过它循环发送所有未决消息。任何新消息应保存在持久存储的最后一个位置。

我打电话时,下面的“发送”这两种方法是点击:

public static void saveMessage(String msg){ 
     Hashtable hashtable=new Hashtable(); 
     persistentObject = PersistentStore.getPersistentObject(KEY); 
     hashtable.put("MessageToSend", msg); 
     persistentObject.commit(); 
    } 

    public static void sendMessage(String msg){ 
     Hashtable hashtable=new Hashtable(); 
     persistentObject = PersistentStore.getPersistentObject(KEY); 
     Vector msgVector = (Vector)persistentObject.getContents(); 
     Enumeration eMsgs=msgVector.elements();; 
      /*synchronized(poObject)*/{ 
       persistentObject.setContents(msgVector); 
       persistentObject.commit(); 
      } 
      int i=0; 
      while(eMsgs.hasMoreElements()){ 
       hashtable=(Hashtable)eMsgs.nextElement(); 
       String encryptedMessage=(String)hashtable.get("MessageToSend"); 
       if(!encryptedMessage.equals("")){ 
        //check internet connection 
        String C0NNECTION_EXTENSION = checkInternetConnection(); 
        if(C0NNECTION_EXTENSION==null) 
        { 
         Dialog.alert("Check internet connection and try again"); 
         return; 
        } 
        else 
        { 
         MyScreen.PostMsgToServer(encryptedMessage); 
         hashtable.remove(encryptedMessage); 
        } 
       } 
       i++; 
      } 
    } 

这只是从我碰到教程/实例的尝试。请帮助。

回答

1

您显示的保存方法实际上并未将散列表放入PersistentObject。尝试这样的事情,而不是:

public static void saveMessage(String msg){ 
    Hashtable hashtable = new Hashtable(); 
    persistentObject = PersistentStore.getPersistentObject(KEY); 
    hashtable.put("MessageToSend", msg); 
    persistentObject.setContents(hashtable); // <- you were missing this 
    persistentObject.commit(); 
} 

这仍然可能不是一个很大实现,因为我假设你可能想为saveMessage()多次,并持久存储添加多个消息(?)。这是对的,还是只能保存一条消息? (如果这是真的,你可以忽略saveMessage()这下建议)

public static void saveMessage(String msg){ 
    persistentObject = PersistentStore.getPersistentObject(KEY); 
    Hashtable hashtable = (Hashtable) persistentObject.getContents(); 
    if (hashtable == null) { 
     // lazily initialize the store contents 
     hashtable = new Hashtable(); 
     hashtable.put("MessagesToSend", new Vector()); 
    } 
    Vector queuedMessages = (Vector) hashtable.get("MessagesToSend"); 
    queuedMessages.addElement(msg); 
    // write the store contents to device storage 
    persistentObject.setContents(hashtable); 
    persistentObject.commit(); 
} 


/** 
* @param msg TODO: I'm not sure why msg needs to be passed, if 
*     saveMessage(msg) was called first? 
*/ 
public static void sendMessage(String msg){ 
    // TODO: you could choose to save the message here, so that the caller 
    // need not remember to call both sendMessage() and saveMessage() 
    // saveMessage(msg); 
    persistentObject = PersistentStore.getPersistentObject(KEY); 
    Hashtable hashtable = (Hashtable) persistentObject.getContents(); 
    if (hashtable != null) { 
     // check for saved messages first, and send them 
     Vector msgVector = (Vector) hashtable.get("MessagesToSend"); 
     Enumeration eMsgs = msgVector.elements(); 
     Vector toDelete = new Vector(); 
     while (eMsgs.hasMoreElements()) { 
       String encryptedMessage = (String)eMsgs.nextElement(); 

       // if the send was successful, you should delete message from the store 
       toDelete.addElement(encryptedMessage); 
     } 

     eMsgs = toDelete.elements(); 
     while (eMsgs.hasMoreElements()) { 
       // we can delete this sent message now 
       msgVector.removeElement((String)eMsgs.nextElement()); 
     } 
     // re-write the persistent store to the device 
     persistentObject.setContents(hashtable); 
     persistentObject.commit(); 
    } 
} 

我也很一般喜欢引导你作出一切static了......这么说,这真是一个更大的,不相关的问题在这里,而且确实发生的情况是,持久存储对象可能是应用程序中唯一的对象(但更好的实现方式可能会避免所有这些static声明)。

更新:我有点不清楚你希望如何调用这两种方法。根据您的描述,似乎您拨打saveMessage(msg)然后sendMessage(msg)发送被用户点击。如果你先保存消息,然后执行,那么就不需要通过msg进入sendMessage(),因为sendMessage()会发送出全部已保存,未发送的消息在队列中(向量)。所以,sendMessage()的API有一个不必要的参数。或者,我想你可以离开sendMessage(String)作为唯一的公开方法,并且首先拨打sendMessage(String)saveMessage(String)

无论如何,这取决于你,以及你希望你的方法调用语义工作。上面的代码应该解决存储和检索持久对象的基本问题。

+0

谢谢。这个想法是首先存储每条消息,然后通过向量循环发送每条消息。我通过添加发送消息的代码来尝试上面的代码。什么都没发生。出于某种原因,我的调试工作不正常,所以我不知道错误来自哪里。但我检查了服务器,并且消息没有通过。尽管如此,我点击了关闭Wifi的发送,以确保在第三条消息排队等待Wifi发送开启之前,向量已经有两个条目。什么似乎是原因? – Sarah 2013-02-13 11:33:45

+0

@Sarah,以及如果您的发送代码中有任何问题,那将是一个单独的问题。再次,我从上面的例子中拿出了这些代码,只关注保存消息队列的问题。我会建议先删除所有的PersistentObject代码。实现'sendMessage()',以便它直接发送**一条**消息。确保首先工作,将消息传递到服务器。一旦这个工作,然后加回PersistentObject代码。而且,我一定会努力恢复调试能力,因为这对其他所有方面都有帮助。 – Nate 2013-02-13 21:39:31