Android中消息的处理程序出现问题

jgzswidk  于 2023-01-15  发布在  Android
关注(0)|答案(4)|浏览(77)

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

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)

我可以理解,当我再次发送相同的消息时,我会遇到这个异常。但我不知道如何解决这个问题,如果有人知道请帮助我。
谢谢你,
拉贾潘迪安

ruoxqz4g

ruoxqz4g1#

您不应重复使用Message对象。如果您需要一次又一次地为Message添加种子,请记住在每次发送消息时新建一个新的Message对象。

atmip9wb

atmip9wb2#

有一个帮助器方法可以复制你的消息。通过它你可以发送你原始消息的副本,而不是重新发送同一个对象(如果之前的对象还在使用,那么重新发送会失败)。

public static Message obtain (Message orig);

其他人建议从处理程序中删除消息并重新发送。这将解决异常,但您不太可能希望这样。删除和重新发送可能会导致未送达的消息丢失。这就是为什么我建议复制您的消息。
检查您的邮件,并确保您不发送任何邮件两次。

    • 更新日期:**

为了清楚起见...你可以用相同的what(或其他相同的参数)发送消息,只要你愿意。你唯一需要确定的是每次发送消息时都要生成新的Message。你不需要删除任何东西,它会被添加到Handler的消息队列中。

lyfkaqu1

lyfkaqu13#

尝试每次创建新的消息示例,即使你可以发送相同的数据,但只是创建新的消息示例,为每一次。显示在使用中不创建的问题。例如:

Bundle bundle = new Bundle();
bundle.putString("SahittoEntryAddedDirect", "SahittoEntryAddedDirect");

builder.setPositiveButton("Finalize Adding", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        Message msg = new Message();
        msg.setData(bundle);
        ReadBooksList.messageHandler.sendMessage(msg);
    }
});

               
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        Message msg = new Message();
        msg.setData(bundle);
        ReadBooksList.messageHandler.sendMessage(msg);
    }
});

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialogInterface) {
        Message msg = new Message();
        msg.setData(bundle);
        ReadBooksList.messageHandler.sendMessage(msg);
    }
});
rnmwe5a2

rnmwe5a24#

你需要从你的处理程序中删除消息。请看我下面的例子:我使用此处理程序向对话框(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
    }
};

相关问题