【问题标题】:Smack API ,ChatMessageListener interface not working properlySmack API,ChatMessageListener 接口无法正常工作
【发布时间】:2016-05-29 06:05:11
【问题描述】:

我是 smack api 的初学者,我已经浪费了 1 天的时间来尝试和理解它。请善待

下面的方法没有被调用:

@Override
public void processMessage(Chat chat, Message message) {
    Log.d("processMessage234:", "Getting Message here");

}

下面是我的完整java代码:

public class Activity2 extends AppCompatActivity implements ChatManagerListener,ChatMessageListener,PacketListener {

MyXmpp2 myXmpp2;
Button isOnline;
AbstractXMPPConnection connection;
ChatManager chatManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_2);
    isOnline = (Button) findViewById(R.id.button6);
    myXmpp2 = new MyXmpp2();


}

@Override
protected void onResume() {
    super.onResume();


    isOnline.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            connection = myXmpp2.getConnection();
            Log.d("isOnline:", myXmpp2.getConnection().isConnected() + "");

            chatManager = ChatManager.getInstanceFor(connection);
            Chat c = chatManager.createChat("baba@abc", new ChatMessageListener() {
                @Override
                public void processMessage(Chat chat, Message message) {
                    Log.d("processMessage000:", "Getting Message here");
                }
            });

            try {
                c.sendMessage("lol");
                //This is working fine
            } catch (SmackException.NotConnectedException e) {
                e.printStackTrace();
            }
        }

    });

}

@Override
public void chatCreated(Chat chat, boolean createdLocally) {

    if (!createdLocally) {
        chat.addMessageListener(new ChatMessageListener() {
            @Override
            public void processMessage(Chat chat, Message message) {
                Log.d("processMessage:", "Getting Message here");
            }
        });
    }
}

@Override
public void processMessage(Chat chat, Message message) {
    Log.d("processMessage234:", "Getting Message here");
//This is not getting invoked

}

@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
    Log.d("processPacket:", "Getting Packets here");
}

}

我可以在日志中读取发送的数据包和接收的数据包如下:

D/SMACK: SENT (0): <message to='baba@abc ......
D/SMACK: SENT (0): <message from='baba@abc ......

但我无法调用该方法

void processMessage(Chat chat, Message message){.....  }

任何建议都非常有帮助:)

【问题讨论】:

    标签: java xmpp smack


    【解决方案1】:

    感谢 Mack94 拯救了我的一天,我正在上传我的完整代码以帮助其他人

    public class Activity2 extends AppCompatActivity {
    
    MyXmpp2 myXmpp2;
    Button isOnline;
    AbstractXMPPConnection connection;
    ChatManager chatManager;
    ChatManagerListener chatManagerListener;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
        isOnline = (Button) findViewById(R.id.button6);
        myXmpp2 = new MyXmpp2();
    
    
    
    }
    
    @Override
    protected void onResume() {
        super.onResume();
    
    
        isOnline.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                connection = myXmpp2.getConnection();
                Log.d("isOnline:", myXmpp2.getConnection().isConnected() + "");
    
    
                chatManager = ChatManager.getInstanceFor(connection);
                chatManager.addChatListener(chatManagerListener);
    
    
        });
    
        chatManagerListener = new ChatManagerListener() {
            @Override
            public void chatCreated(Chat chat, boolean createdLocally) {
    
                chat.addMessageListener(new ChatMessageListener() {
                    @Override
                    public void processMessage(Chat chat, Message message) {
                        Log.d("Hello::","World");
                        if(message.getBody()!=null)
                        {
                            Log.d("Message::",message.getBody());
    
                        }
                    }
                });
            }
        };
    
    }
    
    }
    

    【讨论】:

      【解决方案2】:
      @Override
      public void processMessage(Chat chat, Message message) {
          Log.d("processMessage234:", "Getting Message here");
      
      }
      

      我不太明白你想做什么,但它没有被调用,因为它需要在ChatMessageListener 中调用。由于constant listening,它需要在与整个应用程序不同的线程上工作。

      在这里你正在运行新线程,所以它应该可以工作并且应该监听传入的消息。

      chat.addMessageListener(new ChatMessageListener() {
          @Override
          public void processMessage(Chat chat, Message message) {
              Log.d("processMessage:", "Getting Message here");
          }
      });
      

      请多解释,我会尽力帮忙的!

      【讨论】:

      • 答案是错误的。 OP 的 Activity 扩展了 ChastMessageListener。此外,回调总是在与 Activity 不同的线程(将是 UI/主线程)中调用。
      • 我的回答哪里错了?这是绝对正确的。我不会在任何地方犯错。更重要的是,Avtivity 在哪里扩展 ChatMessageListender?我没看到。
      • 首先,感谢两位对我的帮助。我只是想试试你的代码 Mack,还有一件事 ChastMessageListener 是一个接口。你为什么说 Activity 扩展 ChastMessageListener
      • 因为你写了“公共类Activity2扩展了AppCompatActivity实现了ChatManagerListener,ChatMessageListener,PacketListener”
      猜你喜欢
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 2013-12-16
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多