【问题标题】:Toast is crashing Application, even inside threadToast 正在使应用程序崩溃,甚至在线程内
【发布时间】:2021-08-04 06:05:13
【问题描述】:

我的 android 应用程序中有一个 onClick 事件触发以下代码,但它不断使我的应用程序崩溃。我把它放在一个线程中只是因为我读到那应该防止崩溃。 ctx 还指的是活动的上下文(它是我在活动集中创建的一个变量,等于这个。我已经阅读并尝试了几件事。任何帮助都会很棒。谢谢!

Thread toastThread = new Thread() {
  public void run() {
    Toast alertFailure = Toast.makeText(ctx, "Login Failed", Toast.LENGTH_LONG);
    alertFailure.show();
  }
};
toastThread.start();

【问题讨论】:

标签: android toast


【解决方案1】:

你需要使用runOnUiThread

类似

runOnUiThread(new Runnable() {
    public void run()
    {
        Toast.makeText(ctx, toast, Toast.LENGTH_SHORT).show();
    }
});

Toast 是一个UI 元素,因此它需要在UI Thread 上运行,而不是在背景Thread 上运行。

但是,如果这就是您使用它的全部目的,那么您不需要单独的 Thread 来显示 Toast。如果您可以解释您如何使用它的背景,那么也许我们可以提供更好的方法。此外,如果您在您的Activity 内,那么您不需要Context 的变量。您可以改用ActivityName.this 来访问Activity Context

【讨论】:

  • 出现错误无法解决符号活动。我应该把其他东西放在那里吗?
  • 抱歉,我复制了我拥有的其他东西,但没有足够快地更改它。查看我的编辑。
  • 检查这个库compile 'com.shamanland:xdroid-toaster:0.0.5',它不需要runOnUiThread() 或Context 变量,所有例程都消失了!只需调用Toaster.toast(R.string.my_msg); 这是示例:github.com/shamanland/xdroid-toaster-example
【解决方案2】:

你可能没有实例化你的 ctx 变量,所以你得到的是 NULL 指针。

你不应该把它放在一个线程中,这实际上是一个非常糟糕的主意(知道你才刚刚开始)。

执行:adb logcat 以查看您的日志输出。

【讨论】:

  • 如何在 android studio 中查看我的登录信息?我刚从eclipse切换
  • 如果您是初学者,文档甚至建议您现在不要过多依赖 Android Studio,因为它是一个预发布版本。我建议在您对 Android 开发更加熟悉之前,坚持使用 Eclipse 进行主要开发。
  • 我不了解 Android Studio(并且同意您应该使用 Eclipse 作为初学者)。您可以从终端提示符(IDE 外部)发出该日志命令
【解决方案3】:

您不需要其他线程,您的 ctx 变量可能是导致它的原因,尝试使用 getApplicationContext(),这应该可以:

import android.widget.Toast;

Toast.makeText(getApplicationContext(), "Login Failed", Toast.LENGTH_LONG).show();

【讨论】:

  • 你不能在非 ui 线程中显示任何与 UI 相关的元素,这可能是他崩溃的原因
  • 这是真的,如果你试图做一些除了 Toast 之外的事情,例如网络相关,你应该使用 AsyncTask 否则你的应用程序会崩溃,虽然我很确定如果您的目标是 ICS 或 JB,它无论如何都不会让您构建项目。
【解决方案4】:

只有主线程可以改变 UI。这就是您的应用程序崩溃的原因。在主线程上做你的工作,如果你在做一些繁重的事情,比如网络或 IO,你应该使用AsyncTask,因为每个线程有 5 秒的响应时间。

【讨论】:

    【解决方案5】:

    也许这个可以帮助你。

    runOnUiThread(()->Toast.makeText(this,"I am a Toast message",Toast.LENGTH_SHORT).show());
    

    【讨论】:

      【解决方案6】:

      你可以这样做。

      ((Button)findViewById(R.id.myButton)).setOnClickListener(new OnClickListener(){
          public void onClick(View v) {
              Toast.makeText(MyActivity.this, "Login Failed", Toast.LENGTH_LONG).show();
          }
      });
      

      地点:

      • myButton 是视图的 ID
      • myActivity 是您的活动

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 2021-06-09
        相关资源
        最近更新 更多