Wyloguj się, aby dodać znajomego w xmpp smack

W mojej aplikacji, gdy muszę dodać znajomego, zwykle wysyłam pakiety subskrypcji 4 razy, tj

A-> B (subskrybuj) B-> A (subskrybowane) B-A (subskrybuj) A-> B (subskrybowane)

Po każdym kroku widzę na serwerze status zmieniający się natychmiast.

Ale w mojej aplikacji pojawia się dopiero po ZALOGU i ZALOGU. OSOBA MUSI ZROZUMIEĆ RAZ PONAD PO DODAWANIU PRZYJACIELA I NASTĘPNIE TYLKO PRZYJACIEL ZNAJDUJE SIĘ W WYKAZIE PRZYJACIELA>

Jaki jest problem? Znalazłem dużo, ale nie znalazłem żadnego błędu :(

W logatorze nie pojawia się żaden błąd.

Wydrukowałem również wyjście syso po wysłaniu każdego pakietu. Zawsze mówi jako NONE (w przypadku osoby, do której wysyłane jest żądanie) i Zawsze mówi TO / FROM (w przypadku użytkownika, który wysłał prośbę przyjaciela). i loguje się ponownie.

Proszę pomóż mi :(

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

Wyśle powiadomienie do innego użytkownika .. o zezwoleniu na napisanie tego kodu: -

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

to samo robi się ponownie na zezwól ponownie użytkownikowi, który zainicjował żądanie.

Proszę pomóż. Stan subskrypcji zmienia się natychmiast na serwerze, ale w aplikacji aktualizuje się po wylogowaniu.

Oto kod reprezentujący listy

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

Dzięki

questionAnswers(1)

yourAnswerToTheQuestion