【发布时间】:2014-08-17 17:03:20
【问题描述】:
我正在使用 AlarmManager 来唤醒设备并运行一些任务。这些都是在 IntentService 中完成的,所以在一个与主线程分开的线程上。工作完成后,我想举杯敬酒。但是,我收到此日志警告,但没有显示 toast:
W/MessageQueue﹕ Handler (android.os.Handler) {b12716d0} sending message to a Handler on a dead thread
java.lang.RuntimeException: Handler (android.os.Handler) {b12716d0} sending message to a Handler on a dead thread
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:320)
at android.os.Handler.enqueueMessage(Handler.java:626)
at android.os.Handler.sendMessageAtTime(Handler.java:595)
at android.os.Handler.sendMessageDelayed(Handler.java:566)
at android.os.Handler.post(Handler.java:326)
at android.widget.Toast$TN.hide(Toast.java:370)
at android.app.ITransientNotification$Stub.onTransact(ITransientNotification.java:55)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
我知道关于这个主题还有其他一些问题,但我已经尝试了所有建议,但都没有奏效。我正在使用:
Handler handler = new Handler();
handler.post(new Runnable()
{
@Override
public void run()
{
Toast.makeText(context, R.string.toast, Toast.LENGTH_LONG).show();
}
});
我也试过了:
Handler handler = new Handler(Looper.getMainLooper());
我仍然收到警告,但没有吐司。
在我的 IntentService 中显示这个 toast 的方法是什么?
提前致谢!
【问题讨论】:
-
使用
Notification而不是Toast。推理?一般来说,Services不应该干扰 UI(除非您的应用程序中的关联Activity当前正在显示),而且Toast的生命周期非常短暂(仅几秒钟)。如果练习的目的是向用户传达一些有用的信息,那么用户很容易将视线从他们的设备上移开并完全错过Toast- 浪费您的时间和代码,并且没有用用户。Notification有更好的用途。 -
是的,我在发布问题后不久就意识到了这一点,并相应地更改了我的应用程序。尽管如此,我认为这仍然是一个很好的话题,从学术上讲。感谢您的回答和cmets!