0

一定の間隔でサーバーにメッセージを送信する BlackBerry アプリケーションがあります。メッセージは、利用可能な接続方法のいずれかを使用して Web サービス経由で送信されます。Wifi、BIS、TCP/IP など

メッセージは継続的に送信されるため、インターネットが利用できない場合に備えてメッセージをキューに入れ、インターネットが利用可能になったときにメッセージを送信するメカニズムが必要です。そのため、最初に送信メッセージを永続ストアに保存してから、永続ストアを読み取り、それをループして保留中のすべてのメッセージを送信したいと考えています。新しいメッセージはすべて、永続ストアの最後の場所に保存する必要があります。

「送信」をクリックすると、次の2つのメソッドが呼び出されます。

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

これは、私が遭遇したチュートリアル/例からの単なる試みです。親切に助けてください。

4

1 に答える 1

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()そうですか、それともメッセージを 1 つだけ保存できますか? (それが本当なら、この次の提案は無視してかまいません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宣言を回避できます)。

更新:これら 2 つのメソッドをどのように呼び出すかについては、少しわかりません。あなたの説明に基づいて、ユーザーがSendをクリックしたときに両方 saveMessage(msg)を呼び出しているようです。最初にメッセージを保存する場合、私の実装では、に渡す必要はありません。キュー (ベクトル) に保存された未送信のメッセージがすべて送信されるためです。そのため、API forには不要なパラメーターがあります。または、唯一の public メソッドのままにして、最初の呼び出しを行うことができると思いました。sendMessage(msg)msgsendMessage()sendMessage()sendMessage()sendMessage(String)sendMessage(String)saveMessage(String)

いずれにせよ、それはあなた次第であり、メソッド呼び出しのセマンティクスをどのように機能させたいかはあなた次第です。永続オブジェクトの保存と取得の基本的な問題は、上記のコードで対処する必要があります。

于 2013-02-13T11:03:31.347 に答える