我正在Android上进行xmpp聊天。我有下一个情况: 1)我有单人班,有XMPPConnection和2个活动。 2)第一个活动只是一个联系人列表,我可以选择并启动消息。 3)在第二个活动(聊天)中,我为我的连接设置了监听器,并在收到来自特定联系人的消息时添加一些播放的信号。 4)然后我关闭聊天活动并调用onDestroy方法。 5)然后,如果我发信息给我的应用程序 - 我听到信号,它在被破坏的活动中播放(我的意思是播放信号的方法必须通过聊天活动来销毁)。
请解释我为何可能。
public class ChatActivity extends ActionBarActivity {
...
public void beep() {
Uri notification = RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
RingtoneManager.getRingtone(getApplicationContext(), notification).play();
}
...
public void setupListeners(XMPPConnection connection) {
if(connection != null) {
//Set a listener for chat messages
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet packet) {
Message message = (Message) packet;
if (message.getBody() != null && message.getFrom()
.contains(chatModel.getRecipient())) {
chatModel.addMessage(StringUtils.parseBareAddress(message.getFrom())
+ " :" + message.getBody());
beep();
}
}
}, new MessageTypeFilter(Message.Type.chat));
//Set a listener for normal messages
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet packet) {
Message message = (Message) packet;
if(message.getBody() != null && message.getFrom()
.contains(chatModel.getRecipient())) {
chatModel.addMessage(StringUtils.parseBareAddress(message.getFrom())
+ " :" + message.getBody());
beep();
}
}
}, new MessageTypeFilter(Message.Type.normal));
}
}
答案 0 :(得分:2)
Objects
时,Java中的 Activity
不会立即销毁。此外,您无法手动调用垃圾收集器。您可以做的是使onDestroy()
方法中的对象无效:
connection = null;
答案 1 :(得分:2)
您是否尝试在活动的onDestroy中断开连接?或者删除听众? 由于这些内部类(它们包含对其外部类的(隐藏)引用 - 在这种情况下是您的Activity,因此Activity可能无法进行垃圾回收。因此,删除侦听器或断开连接应该可以解决问题。
编辑:像Gusdor所说,你想要删除onPause()方法中的监听器,并在onResume()中再次添加它们。
Edit2:如果您希望XMPP Connection在后台运行,您应该考虑使用后台服务来处理Connection和消息,而不是活动。