2013-02-13 2 views
0

고정 된 간격으로 서버에 메시지를 보내는 BlackBerry Application이 있습니다. 메시지는 사용 가능한 연결 방법 중 하나를 사용하여 웹 서비스를 통해 전송됩니다. 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() 여러 번 호출하고 영구 저장소에 하나 이상의 메시지를 추가 할 수 있으리라 믿고있어 때문에 (?). 맞습니까? 아니면 한 가지 메시지 만 저장할 수 있습니까? 말했다

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을 만들기에서 당신을 조종하고 싶습니다는 ..., 그 여기에 정말 큰 관련이없는 문제이다 (즉,이 사실이라면, 당신은 saveMessage()이 다음 제안을 무시할 수 있습니다) 영구 저장소 객체가 응용 프로그램에 고유 한 전역 객체가 될 가능성이 있습니다 (더 나은 구현이지만이 모든 static 선언을 피할 것입니다).

업데이트 : 나는이 두 가지 방법을 어떻게 호출 할 것으로 예상되는지 조금 불분명합니다. 귀하의 설명을 바탕으로, 모두saveMessage(msg)으로 전화를 걸었으며 sendMessage(msg)을 클릭하면 나타납니다. 내 구현에 따라 메시지를 먼저 저장하면 sendMessage()모두 대기열 (벡터)에 저장된 메시지를 보내므로 sendMessage()msg을 전달할 필요가 없습니다. 따라서 sendMessage()의 API에는 불필요한 매개 변수가 있습니다. 아니면 sendMessage(String)을 유일한 공개 방법으로 남겨두고 이 sendMessage(String) 일 수 있다고 가정합니다.

어쨌든, 그것은 당신에게 달렸습니다. 그리고 당신의 메소드가 어떻게 작동 하는지를 당신이 원하는 방법. 영속 객체를 저장하고 검색하는 기본적인 문제는 위의 코드에 의해 다루어 져야한다.

+0

감사합니다. 아이디어는 모든 메시지를 먼저 저장 한 다음 벡터를 반복하여 각 메시지를 보냅니다. 위의 코드를 사용하여 메시지를 보내는 코드를 추가했습니다. 아무 반응이 없습니다. 어떤 이유로, 디버그가 제대로 작동하지 않아서 오류가 발생한 정확한 줄을 알 수 없습니다. 그러나 나는 서버를 점검했고 메시지는 전달되지 않았다.그래도 Wifi가 꺼진 상태에서 보내기를 클릭 했으므로 Wifi가 켜진 상태로 세 번째 메시지가 대기열에 대기되기 전에 벡터에 이미 두 항목이 있는지 확인해야합니다. 이유는 무엇입니까? – Sarah

+0

@Sarah, 송신 코드에 문제가 있으면 별도의 문제입니다. 다시 말하지만, 위의 예에서 코드를 저장하여 메시지 큐 저장 문제에만 집중했습니다. 먼저 모든 PersistentObject 코드를 제거하는 것이 좋습니다. 'sendMessage()'를 구현하여 ** 하나 ** 메시지를 직접 보내도록하십시오. 서버에 메시지를 보내려면 먼저 작동하는지 확인하십시오. 작동하면, PersistentObject 코드에 다시 추가하십시오. 그리고 디버그 기능을 다시 사용하도록 노력할 것입니다. 다른 모든 기능에도 도움이 될 것입니다. – Nate