Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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中消息处理程序存在问题_Android_Exception_Handler - Fatal编程技术网

android中消息处理程序存在问题

android中消息处理程序存在问题,android,exception,handler,Android,Exception,Handler,我在我的应用程序中使用处理程序,在一个屏幕中单击一个按钮将调用一些代码集。要调用该代码集,我将向处理程序发送消息并重写handle messages方法。第一次单击按钮时,处理程序工作正常,代码集被执行。当我第二次点击按钮时,我得到了以下异常 05-03 09:45:25.703: ERROR/AndroidRuntime(1971): FATAL EXCEPTION: main 05-03 09:45:25.703: ERROR/AndroidRuntime(1971): android.ut

我在我的应用程序中使用处理程序,在一个屏幕中单击一个按钮将调用一些代码集。要调用该代码集,我将向处理程序发送消息并重写handle messages方法。第一次单击按钮时,处理程序工作正常,代码集被执行。当我第二次点击按钮时,我得到了以下异常

05-03 09:45:25.703: ERROR/AndroidRuntime(1971): FATAL EXCEPTION: main
05-03 09:45:25.703: ERROR/AndroidRuntime(1971): android.util.AndroidRuntimeException: { what=1 when=7381217 obj=android.app.AlertDialog@462b5c58 } This message is already in use.
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at android.os.Handler.sendMessageAtTime(Handler.java:457)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at android.os.Handler.sendMessageDelayed(Handler.java:430)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at android.os.Handler.sendMessage(Handler.java:367)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at com.mysnob.utils.MessageDialog$8.onClick(MessageDialog.java:93)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at android.os.Looper.loop(Looper.java:144)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at android.app.ActivityThread.main(ActivityThread.java:4937)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at java.lang.reflect.Method.invokeNative(Native Method)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at java.lang.reflect.Method.invoke(Method.java:521)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-03 09:45:25.703: ERROR/AndroidRuntime(1971):     at dalvik.system.NativeStart.main(Native Method)
我可以理解,当再次发送相同的消息时,我遇到了这个异常。但我不知道如何解决这个问题,如果有人知道,请帮助我

谢谢


Rajapandian

您需要从处理程序中删除消息。 请参阅下面的示例:我使用此处理程序将消息发送到我的对话框(mDialog)


有一个助手方法可以复制消息。 这样,您就可以发送原始消息的副本,而不是重新发送相同的对象(如果仍在使用前一个对象,则会失败)

其他人建议从处理程序中删除消息,然后重新发送。它可以解决异常,但您不太可能希望这样。删除和重新发送可能会导致未送达的邮件丢失。这就是为什么我建议复制你的信息

检查您的邮件,确保不会发送任何邮件两次

更新:


要说清楚。。。您可以使用相同的
what
(或其他相同参数)发送任意次数的消息。你唯一要确定的是,每次发邮件时都要发新邮件。您不必删除任何内容,它将被添加到处理程序的消息队列中。

您不应重复使用消息obj。如果您需要一次又一次地为消息设置种子,请记住每次发送消息时都要新建一条新消息obj。

是否在处理程序和消息中调用removeMessages(what)。获取消息(what)以获取消息?@JAL我正在使用Message.obtainMessage()获取消息,我检查了消息。obtainMessage(what)但是我没有找到任何这样的方法。从docs中,获取消息(int what)与获取消息()相同,只是它还设置了返回消息的what成员。链接:可能重复的removeMessages(what)与ActainMessage(what)是不必要的,我用这个代码制作了一个副本Message=Message.Acquire(handler);message.obj=“准备…”;handler.sendMessage(message);但是你仍然会得到同样的错误:(这个消息已经被使用)我已经做了一千次了,现在我已经测试过了。它起作用了。你一定把smth搞砸了。你不必删除消息,因为操作系统会帮你做的。这完全是自动的。完全正确:)。我们只能使用一次消息引用。
/**
 * this property will help send messages to the dialog
 */
Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        mDialog.setMessage((String) msg.obj);
        removeMessages(0); //this is very important
    }
};
public static Message obtain (Message orig);