2012-11-12 75 views
1

在我的應用程序時,我有添加好友我通常發送訂閱包4倍 即註銷添加好友在XMPP咂嘴

A-> B(訂閱) B-> A(認購) BA(訂閱) A-> B(訂閱)

每個步驟I的狀態立即改變在服務器上看到後。

但是在我的應用程序中,它只能在LOGGING OUT和LOGGING之後再次反映出來。 在他添加好友之後,他必須註銷一次,然後他的好友名單上將顯示好友>

問題是什麼?我已經找到了很多,但因此未發現任何錯誤:(

沒有錯誤顯示在logcat中。

我還印製了syso輸出的每個數據包被髮送後,它總是說爲NONE(此案。發送請求的人)和總是說TO/FROM(在發送好友請求的用戶的情況下)。兩者都沒有被反映出來,直到一個人退出並重新登錄。

請幫我:(

Add Friend Function 

public boolean addFriend(String jid) { 
     String nickname = null; 
     String idExtension = jid+"@abc.hostname.com"; 
     nickname = StringUtils.parseBareAddress(jid); 
     if (!roster.contains(idExtension)) { 
      try { 
       roster.createEntry(idExtension, nickname, null); 
       //to subscribe the user in the entry 
       Presence subscribe = new Presence(Presence.Type.subscribe); 
       subscribe.setTo(idExtension);    
       connection.sendPacket(subscribe); 
       return true; 

      } catch (XMPPException e) { 
       System.err.println("Error in adding friend"); 
       return false; 
      } 
     } else { 
      return false; 
     } 
    } 

它會se ND通知其他用戶..在允許此代碼被寫入: -

btn_Allow = (Button)findViewById(R.id.btn_manageNotification_ALLOW); 
     btn_Allow.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 

       //accept the friends subscription 
       Presence subscribed = new Presence(Presence.Type.subscribed); 
       subscribed.setTo(id);    
       connection.sendPacket(subscribed); 



       mCustomProgressDialog = CustomProgressDialog.createDialog(
         ManageNotification.this, "", ""); 
       mCustomProgressDialog.show(); 
       mCustomProgressDialog.setCancelable(false); 
       new Thread(){ 
        public void run() { 

         try { 
          sleep(5000); 
          //mXmconn.getContactList(); 

          /*Presence subscribed = new Presence(Presence.Type.subscribe); 
          subscribed.setTo(id);    
          System.out.println("The user is :"+id); 
          connection.sendPacket(subscribed);*/ 

         } catch (InterruptedException e) {}      
         mReturnUserMenu.sendEmptyMessage(0); 

        }; 
       }.start(); 
      } 
     }); 

相同則再次上進行再次允許誰發起請求的用戶。

請幫忙。訂閱狀態在服務器上立即發生變化,但是在註銷一次後它將更新。

這裏是代表名單

public void getContactList(){ 

     roster = connection.getRoster(); 

     Collection<RosterEntry> entries = roster.getEntries(); 
     System.out.println("Total=="+entries.size()); 
     mfriendList.clear(); 
     mfriendPendingList.clear(); 
     mfriendRequestList.clear(); 
     for (RosterEntry entry : entries) { 
      mFriendsDataClass = new FriendsDataClass(); 

      mFriendsDataClass.friendName = entry.getUser().toString(); 

      String user = entry.getUser(); 

      int index_of_Alpha = user.indexOf("@"); 
      /*System.out.println("The current working user is : "+user); 
      System.out.println("His status is"+entry.getType().toString());*/ 
      String subID = user.substring(0, index_of_Alpha); 
      Presence availability = roster.getPresence(user); 
      Mode userMode = availability.getMode(); 

      mFriendsDataClass.availability = ""; 
      mFriendsDataClass.friendNickName = subID;   
      mFriendsDataClass.friendStatus = stusMsg.toString(); 
      mFriendsDataClass.friendState = retrieveState_mode(availability.getMode(),availability.isAvailable()); 
      if(entry.getType().toString().equalsIgnoreCase("to")){ 
       //getContactList(); 
       mfriendRequestList.add(mFriendsDataClass); 
      }else if(entry.getType().toString().equalsIgnoreCase("from")){ 
       //getContactList(); 
       mfriendPendingList.add(mFriendsDataClass); 
      }else if(entry.getType().toString().equalsIgnoreCase("both")){ 
       //getContactList(); 
       mfriendList.add(mFriendsDataClass); 
      }   
     } 
    } 

感謝

+0

請提供一些代碼,因爲它很難回答這個使用這個場景,但我會建議你做一個刷新按鈕,它可以作爲一個登錄,並再次重新加載的一切,你也可以保存用戶名稱和密碼,並重新登錄,而用戶不知道它 –

+0

@GirishNair用戶正在與其他人聊天什麼?連接將丟失然後? 有什麼辦法刷新xmpp連接? :( –

+0

保存聊天信息,並嘗試重新加載。你有沒有檢查過這個http://stackoverflow.com/questions/9632865/reset-the-xmpp-connection-if-the-page-gets-refreshed –

回答

2

要發送,你必須使用一個請求的代碼,

roster.createEntry("mail_id", null, null); 

而對於Listening請求您在使用聽PacketListener。並檢查Presence

Presence presence = (Presence) packet; 
Presence presence_request = new Presence(Presence.Type.subscribed); 
presence_request.setTo(presence.getFrom()); 
presence_request.setType(Presence.Type.subscribed); 
presence_request.setFrom("current_logged_in_user"); 
connection.sendPacket(presence_request); 
roster.createEntry(presence.getFrom(), null, null); 
+0

我已經做了同樣的方式和它的工作alrite,但問題是我必須註銷每次看看這些變化:( –

+0

我在上面的解決方案中遇到了一個問題,當我在數據包監聽器中使用上面的代碼時,它可以正常工作,但我想在另一個活動中使用其中一個允許按鈕來接受frnd請求,然後上面的代碼只有 - TO和FROM訂閱,而不是BOTH訂閱,我怎樣才能使用它在ALLOW按鈕 –

+0

我使用完全相同的代碼與我的價值觀 –