【问题标题】:BlackBerry - write and read from persistent object vectorBlackBerry - 从持久对象向量中写入和读取
【发布时间】:2013-01-28 20:22:18
【问题描述】:

我有一个 BlackBerry 应用程序,它以固定的时间间隔向服务器发送消息。使用任何可用的连接方法通过网络服务发送消息; Wifi、BIS、TCP/IP 等。

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

点击“发送”时,我正在调用以下两种方法:

    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++;
            }
    }

这只是我遇到的教程/示例的尝试。请帮忙。

【问题讨论】:

    标签: blackberry vector read-write persistent-storage


    【解决方案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 ...也就是说,这确实是一个更大的、无关的问题,而且您的持久存储对象可能是唯一的, global 应用程序中的对象(但是,更好的实现可能会避免所有这些 static 声明)。

    更新:我有点不清楚您希望如何调用这两种方法。根据您的描述,当用户单击 Send 时,您似乎调用了 both saveMessage(msg)sendMessage(msg)。如果您先保存消息,使用我的实现,则无需将msg 传递给sendMessage(),因为sendMessage() 将发送 all 队列中已保存、未发送的消息(向量)。因此,sendMessage() 的 API 有一个不必要的参数。或者,我想您可以将sendMessage(String) 作为唯一的公共方法,并让sendMessage(String) 第一次调用saveMessage(String)

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

    【讨论】:

    • 谢谢。这个想法是先存储每条消息,然后循环通过向量发送每条消息。我通过添加发送消息的代码来尝试上面的代码。什么都没发生。出于某种原因,我的调试无法正常工作,所以我不知道错误出现的确切位置。但我检查了服务器,消息没有通过。尽管如此,我在 Wifi 关闭的情况下单击了发送,以确保在第三条消息在 Wifi 打开的情况下排队发送之前,向量已经有两个条目。似乎是什么原因?
    • @Sarah,如果您的发送代码有任何问题,那将是一个单独的问题。同样,我从上面的示例中删除了该代码,只关注保存消息队列的问题。我建议首先删除所有 PersistentObject 代码。实现sendMessage(),让它直接发送one 消息。确保它首先工作,以便将消息发送到您的服务器。一旦工作正常,然后重新添加 PersistentObject 代码。而且,我当然会努力恢复您的调试功能,因为这也将有助于其他一切。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多