Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么onDestroy不终止它的方法?_Android_Android Lifecycle_Asmack - Fatal编程技术网

Android 为什么onDestroy不终止它的方法?

Android 为什么onDestroy不终止它的方法?,android,android-lifecycle,asmack,Android,Android Lifecycle,Asmack,我现在正在Android上进行xmpp聊天。我有下一个情况: 我有一节带XMPPConnection的单音课和两项活动。 2第一个活动只是一个联系人列表,我可以选择并开始留言。 3在第二个activitychat中,我为我的连接设置了侦听器,并添加了一些信号,当收到来自特定联系人的消息时,这些信号会播放。 4然后我关闭聊天活动并调用onDestroy方法。 5然后,如果我向我的应用程序发送消息-我听到信号,它在销毁活动中播放我的意思是播放信号的方法必须在聊天活动中销毁 请解释一下为什么可能

我现在正在Android上进行xmpp聊天。我有下一个情况: 我有一节带XMPPConnection的单音课和两项活动。 2第一个活动只是一个联系人列表,我可以选择并开始留言。 3在第二个activitychat中,我为我的连接设置了侦听器,并添加了一些信号,当收到来自特定联系人的消息时,这些信号会播放。 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));
       }
   }
退出活动时,Java中的对象不会立即销毁。此外,您不能手动调用垃圾收集器。您可以做的是取消onDestroy方法中的对象:

退出活动时,Java中的对象不会立即销毁。此外,您不能手动调用垃圾收集器。您可以做的是取消onDestroy方法中的对象:


您是否尝试断开活动onDestroy中的连接?还是删除侦听器? 由于这些内部类包含对其外部类的隐藏引用——在本例中是您的活动,因此该活动可能无法被垃圾收集。因此,删除侦听器或断开连接应该可以做到这一点

编辑:正如Gusdor所说,您希望删除onPause方法中的侦听器,然后在onResume中再次添加它们


Edt2:如果您希望XMPP连接在后台运行,您应该考虑使用后台服务来处理连接和消息,而不是使用Actudio。

< P>您是否尝试在您的活动的OnDebug中断开连接?还是删除侦听器? 由于这些内部类包含对其外部类的隐藏引用——在本例中是您的活动,因此该活动可能无法被垃圾收集。因此,删除侦听器或断开连接应该可以做到这一点

编辑:正如Gusdor所说,您希望删除onPause方法中的侦听器,然后在onResume中再次添加它们


Edt2:如果您希望XMPP连接在后台运行,您应该考虑使用后台服务来处理连接和消息,而不是Actudio。

如果您想成为超级符合者,谷歌会建议暂停活动时断开连接。对于聊天之类的东西,你可能希望使用后台服务来连接,而不是活动,这样即使活动关闭,它也可以运行。你是对的,我删除然后添加侦听器-现在,一切都好了。如果你想超级一致,谷歌会建议在活动暂停时断开连接。是的,你说得对。对于像聊天这样的事情,你可能希望使用后台服务来连接,而不是活动,这样即使活动关闭,它也可以运行。你是对的,我删除然后添加侦听器-现在,一切都好了。你真的验证过被销毁的类正在被销毁吗?您的类可能仍然处于活动状态,因为有对它的引用可以防止它被销毁。你应该用垫子检查一下。在研究这一点时,一个解决方法是在调用onDestroy时使用条件集和布尔集。这样,当您的活动被销毁时,即使类仍然存在,您也可以停止调用这些方法。您是否确实验证了被销毁的类是否按照您认为的方式被销毁?您的类可能仍然处于活动状态,因为有对它的引用可以防止它被销毁。你应该用垫子检查一下。在研究这一点时,一个解决方法是在调用onDestroy时使用条件集和布尔集。这样,当您的活动被破坏时,即使类仍然存在,您也可以停止调用这些方法。
connection = null;