2012-11-02 3 views
5

asmack 패킷에 대한 수신기를 작성하려고합니다. 일어나는 일은 청취자가 가끔씩 패킷을 얻지 않고 처리하는 경우입니다. 여기서, 코드의 일부이다 : 이것은 AsyncTask를의 doInBackground (문자열 PARAMS ...) 부분의 내부Smack Packet Listener가 실행되지 않음

try { 

      XMPPMethods.getConnection().addPacketListener(new PacketListener() { 
        @Override 
        public synchronized void processPacket(Packet packet) { 

         if (packet.getPacketID().equals(lastCustomIQId)) { 

          android.os.Message msg = new android.os.Message(); 
          msg.obj = privateData; 
          msg.what = XMPPMethods.ADD_CONTACT_RESULTS; 
          AddContact.addContactHandler.sendMessage(msg); 
         } 
        } 
       }, new PacketIDFilter(lastCustomIQId)); 

참고있다.

패킷을 사용하여 전송되고 :

JIDIQ가 asmack의 IQ이다
JIDIQ.setPacketID(lastCustomIQId); 
JIDIQ.setFrom(XMPPMethods.getCurrentUserFullUserName()); 
JIDIQ.setType(Type.GET); 
XMPPMethods.getConnection().sendPacket(JIDIQ); 

. 이 코드는 모두 올바르게 실행됩니다. 그러나 때때로 PacketListener는 전송 된 패킷을받지 못합니다. 대신에 PacketCollector를 사용해야하는지, 아니면 리스너가 어떻게 든 죽어 가고 있는지 궁금합니다. 아무도 이것이 패킷을받지 못하는 이유를 알고 있습니까? 이 주제에 대한 지식이 있으면 대단히 감사하겠습니다!

답변

2

다른 패킷 수신기 중 하나가 예외를 throw하는 경우이 문제가 발생할 수 있습니다.
하나의 루프 내에서 하나의 스레드에서 패킷이 모든 패킷 수신자에게 히트 (spack)를 생성 할 때마다. 예외가 패킷 청취자에 슬로우되면 (자), 그 thread를 중단 해 그 이상의 패킷 청취자는 트리거되지 않습니다.

어디에서 일어나고 있는지를 가장 완벽하게 감지하는 방법은 smack을 다시 컴파일하고 PacketReader.java에 오류 처리기를 추가하는 것입니다.

다음은 관련 코드 섹션입니다. Throw되는 예외가 발생하면 오류 처리가 없으므로 스레드가 중단됩니다.

private class ListenerNotification implements Runnable { 

    private Packet packet; 

    public ListenerNotification(Packet packet) { 
     this.packet = packet; 
    } 

    public void run() { 
     for (ListenerWrapper listenerWrapper : connection.recvListeners.values()) { 
      listenerWrapper.notifyListener(packet); 
     } 
    } 
} 
1

패킷 리다이렉터가 패킷을 필터링한다고 생각합니다. 따라서 패킷 수신기는 패킷을 수신하지 못합니다.

패킷 수신기가 패킷을받지 못하면 스맥 로그를 검사하여 패킷 ID가 패킷 필터가 예상하는 값인지 확인하십시오.

+0

나는 이것을 테스트했으며 패킷 ID는 항상 필터 ID와 일치합니다. 또한 ID로 상수를 사용하고 다른 유형의 필터를 사용하여 시도했다. 세 가지 필터 설정 모두 동일한 결과를 얻습니다. 참고 : 활동을 입력 할 때 패킷을 처음 수신 한 경우 IQ를 쿼리하고 패킷을 전송 한 횟수와 상관없이 항상 작동합니다. 반대의 경우도 마찬가지입니다. 활동에 들어가고 패킷이 수신기에서 선택되지 않으면 이후의 모든 IQ 패킷은 수신기에서 수신되지 않습니다. –

+0

@JonathanCornwell 청취자를 등록한 연결이 패킷을받는 연결과 같은지 확인 했습니까? (예를 들어, 연결이 변경 되었기 때문에 클라이언트가 연결을 끊었다가 다시 연결하지만 새 연결에는 수신기가 없습니다.) –

+0

이것도 테스트했지만 연결은 변경되지 않습니다. 나는 모든 액티비티가 공개 버전의 연결에 액세스하여 동일한 결과로 연결이 변경되지 않도록하기 위해 만들었습니다. 업데이트 : 활동을 열면 수신기가 실행될 때마다 보낸 모든 패킷에 대해 올바르게 실행되는 것처럼 보입니다. 그러나 리스너가 실행되지 않으면 전달 된 모든 패킷에 대해 실행되지 않습니다. 활동을 닫고 다시 열면이를 변경할 수 있지만 (작동/작동하지 않음) 이상한 점은 활동을 열거 나 닫은 상태에서 청취자에게 영향을주는 것은 변경되지 않는다는 것입니다. –