为什么在onCreate()之外显示Toast会导致我的应用程序崩溃?

3

旧问题:“为什么创建Toast会导致我的应用程序崩溃?”

如果我不使用Toast,我的应用程序可以正常运行,但是如果我想创建并显示一个简单的Toast,就像这样:

   Toast SimpleToast = Toast.makeText(getApplicationContext(), "Just a toast.",Toast.LENGTH_LONG);
   SimpleToast.setGravity(Gravity.TOP, 0, 0);
   SimpleToast.show();

我在日志中看到以下内容,然后应用程序崩溃:

NotificationService   enqueueToast pkg=games.MyAppName callback=android.app.ITransientNotification$Stub$Proxy@49603368 duration=1
ResourceType          No package identifier when getting name for resource number 0x00000000
AndroidRuntime        Shutting down VM
dalvikvm              threadid=3: thread exiting with uncaught exception (group=0x4001b188)
AndroidRuntime        Uncaught handler: thread main exiting due to uncaught exception
AndroidRuntime        java.lang.NullPointerException

我已经检查了上面的代码,它是导致崩溃的原因。 目前我在模拟器上运行,因为我没有安卓手机。

6个回答

2
据我所知,您不能使用应用程序上下文显示Toast,而必须使用Activity上下文。Toast不绑定在您的应用程序上,而是绑定在您正在显示它的活动上。请尝试使用一个名为ctx的变量来替代getApplicationContext(),并将其设置为指向您的Activity的引用。
祝好运!

每当我在onCreate()方法外部调用Toast.show()时,似乎都会出现错误,尽管我1000%确定在onCreate()完成之前不会调用Toast.show()。我该如何修复这个问题?我想在此活动中定义的onclicklistener的onclick void中显示toast。 - Mervin
4
@Mervin:你的 OnClickListener 已经可以访问你的 Activity -- 如果你的 Activity 名称为 Foo,尝试使用 Foo.this 作为你的 Context。千万不要在涉及 UI 的任何操作中使用 getApplicationContext() - CommonsWare
@CommonsWare:请阅读我帖子中的更新部分,我现在正在onCreate()中创建toast,但即使在onCreate()之外的其他地方使用Toast.Show()也会导致崩溃。 - Mervin
@Mervin:请阅读我的评论。我不在乎你在哪里创建“Toast”。不要使用“getApplicationContext()”。以下是一些项目列表,展示了在应用程序中各种位置成功使用“Toast”的示例:http://github.com/commonsguy/cw-android/tree/master/Messages/Message/ http://github.com/commonsguy/cw-android/tree/master/Maps/NooYawk/ http://github.com/commonsguy/cw-android/tree/master/Menus/Inflation/ http://github.com/commonsguy/cw-android/tree/master/Threads/Asyncer/ - CommonsWare
@Mervin:糖比醋更能吸引苍蝇。如果你想得到答案,试着少一点刻薄。毕竟是你自己要求帮助的。 - mattbasta
显示剩余3条评论

1
任何被视为“阻塞”的功能都必须在线程内创建。这包括模式对话框、写入共享首选项、访问 URL,以及奇怪的是,简单的 Toast 消息。
这些东西在从活动的 onCreate 调用时有效,但需要设置线程/处理程序才能在任何地方调用。

不要在线程中使用Toast。在另一个线程中,它们会导致应用程序崩溃。 - BeniBela

1
@Override
public boolean onTouch(View V, MotionEvent event) {
 ...
 Toast toast = Toast.makeText(V.getContext(), ...

其中V是您的View将正常工作。 您还可以在构造函数中使用appConntext()。


1
由于某些原因,getApplicationContext 返回 null。请在您的 onClick() 方法内部的 Listener 中尝试使用 "ActivityName.this" 替代。

0

看起来你在某个地方尝试解引用一个空指针,请在调试器中逐步执行并查看具体位置。这可能是 .setGravity 调用的问题。这表明 Toast.makeText 未能创建你的 Toast。请注意,Toast 可以从 Activity 或 Service 中创建和显示。


我正在一个继承自Activity的类中创建Toast,在OnClickListener的void onClick方法中。 - Mervin
每当我在onCreate()方法之外调用Toast.show()时,似乎就会出现错误,尽管我非常确定在onCreate()完成之前不会调用Toast.show()。我该如何解决这个问题?我想从此活动中定义的onclicklistener的onclick void中显示toast。 - Mervin

0
将代码放在try-catch块中,并检查抛出的异常的堆栈跟踪。听起来像是在不期望的情况下调用了Activity上的回调方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接