【问题标题】:problem in Handler with messages in android处理程序中的问题与android中的消息
【发布时间】:2011-05-03 04:23:58
【问题描述】:

我在我的应用程序中使用处理程序,在一个屏幕中通过单击一个按钮将调用一组代码。要调用该组代码,我将向处理程序发送消息并覆盖处理消息方法。第一次单击按钮时,处理程序完美运行并执行了一组代码。当我第二次单击该按钮时,出现以下异常。

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)

我可以理解,当我再次发送相同的消息时,我得到了这个异常。但是我不知道如何解决这个问题,如果有人知道请帮助我。

谢谢,

拉贾潘迪安

【问题讨论】:

  • 你是在handler中调用removeMessages(what)和Message.obtainMessage(what)来获取消息吗?
  • @JAL 我正在使用 Message.obtainMessage() 获取消息,我检查了 Message.obtainMessage(what) 但我没有找到任何这样的方法。
  • 从文档中获取消息(int what)与获取消息()相同,除了它还设置返回消息的what成员。链接:developer.android.com/reference/android/os/…
  • removeMessages(what) 不需要使用 gainMessage(what)

标签: android exception handler


【解决方案1】:

你永远不应该重复使用 Message obj。如果您需要一次又一次地播种 Message,请记住每次发送消息时都要新建一个新的 Message obj。

【讨论】:

  • 绝对正确:)。我们只能使用一次消息引用。
【解决方案2】:

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

public static Message obtain (Message orig);

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

检查您的消息,并确保您没有将任何消息发送两次。

更新:

为了清楚起见...您可以根据需要多次发送具有相同what(或其他相同参数)的消息。您唯一需要确定的是,每次发送消息时都要创建新消息。您不必删除任何内容,它将添加到 Handler 的消息队列中。

【讨论】:

  • 我正在使用此代码进行复制 Message message = Message.obtain(handler); message.obj = "准备中..."; handler.sendMessage(消息);但是你仍然会得到同样的错误:(此消息已在使用中)
  • 我已经这样做了一千次了,我现在测试了它。有用。你一定搞砸了。
  • 嗯.. 这有帮助。谢谢。
【解决方案3】:

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

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

【讨论】:

  • 您不必删除该消息,因为操作系统会为您完成。它是完全自动的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 2021-04-25
  • 1970-01-01
相关资源
最近更新 更多