2012-11-02 13 views
5

मैं एक एस्केक पैकेट के लिए श्रोता लिखने की कोशिश कर रहा हूं। क्या हो रहा है यह है कि श्रोताओं को कभी-कभी पैकेट नहीं मिलता है और इसे संसाधित नहीं किया जाता है। यहाँ कोड के कुछ है:स्मैक पैकेट श्रोता नहीं चल रहा

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)); 

ध्यान दें कि यह doInBackground (स्ट्रिंग ... पैरामीटर) एक asynctask के हिस्से के अंदर है।

पैकेट का उपयोग कर भेजा जा रहा है:

JIDIQ.setPacketID(lastCustomIQId); 
JIDIQ.setFrom(XMPPMethods.getCurrentUserFullUserName()); 
JIDIQ.setType(Type.GET); 
XMPPMethods.getConnection().sendPacket(JIDIQ); 

कहाँ JIDIQ एक asmack बुद्धि है। यह कोड सही समय के साथ सही ढंग से चलता है। लेकिन कभी-कभी पैकेट लिस्टनर को केवल पैकेट भेजा नहीं जाता है। मैं सोच रहा हूं कि मुझे इसके बजाय पैकेट कोलेक्टर का उपयोग करना चाहिए, या अगर श्रोता किसी भी तरह मर रहा है। क्या किसी को पता है कि यह पैकेट क्यों नहीं मिलेगा? इस विषय के किसी भी ज्ञान की सराहना की जाएगी!

उत्तर

2

यदि आपके अन्य पैकेट श्रोताओं में से एक अपवाद फेंक रहा है तो यह स्मैक में होगा।
जब भी एक पैकेट एक थ्रेड में सभी पैकेट श्रोताओं को एक थ्रेड में हिट के स्मैक स्पॉन में आता है, तो एक के अंदर लूप के अंदर। यदि एक पैकेट श्रोता में एक अपवाद फेंक दिया जाता है तो यह उस थ्रेड को रोक देगा और कोई और पैकेट श्रोताओं को ट्रिगर नहीं किया जाएगा।

यह कहां हो रहा है यह पता लगाने का सबसे अच्छा तरीका है स्मैक को दोबारा जोड़ना और PacketReader.java में एक त्रुटि हैंडलर जोड़ना।

यहां कोड का प्रासंगिक अनुभाग है। आप देख सकते हैं कि फेंक दिया गया कोई भी अपवाद थ्रेड को रोक देगा क्योंकि कोई त्रुटि प्रबंधन नहीं है।

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

मुझे लगता है कि PacketIDFilter पैकेट फ़िल्टर कर रही है, तो आपके पैकेट श्रोता उन्हें नहीं मिलता है।

अपने पैकेट श्रोता नहीं मिलता है जब पैकेट तो स्मैक लॉग की जाँच करता है, तो पैकेट आईडी पैकेट फ़िल्टर क्या उम्मीद है देखने के लिए।

+0

मैंने इसका परीक्षण किया है, और पैकेट आईडी हमेशा फ़िल्टर आईडी से मेल खाता है। मैंने आईडी के रूप में निरंतर उपयोग करने और एक अलग प्रकार के फ़िल्टर का उपयोग करने का भी प्रयास किया है। सभी तीन फ़िल्टर सेटिंग्स एक ही परिणाम प्राप्त करते हैं। नोट: गतिविधि दर्ज करते समय, यदि पैकेट पहली बार प्राप्त होता है, तो इससे कोई फर्क नहीं पड़ता कि मैं कितनी बार आईक्यू से पूछता हूं और पैकेट भेजता हूं, यह हर बार काम करेगा। उलटा भी सच है, जब मैं गतिविधि में प्रवेश करता हूं और पैकेट श्रोता द्वारा उठाया नहीं जाता है, तो भविष्य के आईक्यू पैकेट श्रोता द्वारा प्राप्त नहीं होंगे। –

+0

@ जोनाथन कॉर्नवेल क्या आपने जांच की है कि कनेक्शन जहां आप श्रोता पंजीकृत करते हैं, वही है जो पैकेट प्राप्त करता है? (उदाहरण के लिए, क्लाइंट डिस्कनेक्ट हो जाता है और फिर कनेक्ट हो जाता है क्योंकि कनेक्टिविटी बदलती है, लेकिन नए कनेक्शन में श्रोता नहीं होता है) –

+0

मैंने इसका परीक्षण भी किया है, लेकिन कनेक्शन कभी नहीं बदलता है। मैंने इसे भी बनाया ताकि सभी गतिविधियों को कनेक्शन के सार्वजनिक संस्करण तक पहुंच हो ताकि यह सुनिश्चित किया जा सके कि कनेक्शन एक ही परिणाम के साथ कभी नहीं बदलता है। अपडेट: ऐसा लगता है कि जब मैं गतिविधि खोलता हूं और श्रोता चलता है, तो यह भेजे गए प्रत्येक पैकेट के लिए यह सही ढंग से चलाया जाएगा। लेकिन जब श्रोता नहीं चलता है, तो यह भेजे गए प्रत्येक पैकेट के लिए नहीं चलेगा। गतिविधि को बंद करना और फिर से खोलना इस (काम कर रहा/काम नहीं कर सकता) बदल सकता है, लेकिन अजीब चीज यह है कि गतिविधि खोलना/बंद करना श्रोता को प्रभावित करने वाली किसी भी चीज को नहीं बदलेगा। –

संबंधित मुद्दे