Toast正在崩溃应用程序,甚至在线程内部

时间:2013-07-01 17:59:50

标签: android toast

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

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

6 个答案:

答案 0 :(得分:10)

您需要使用runOnUiThread

这样的东西
 runOnUiThread(new Runnable() {
            public void run()
            {
                Toast.makeText(ctx, toast, Toast.LENGTH_SHORT).show();
            }
        });
    }

ToastUI元素,因此需要在UI Thread上运行,而不是在后台Thread上运行。

但是,如果您正在使用它,那么您不需要单独的Thread来展示Toast。如果你能解释一下你如何使用它的背景,那么我们可以帮助你找到更好的方法。此外,如果您在Activity内,则不需要Context的变量。您可以使用ActivityName.this来访问Activity Context

答案 1 :(得分:0)

您可能没有实例化ctx变量,因此您将获得NULL指针。

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

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

答案 2 :(得分:0)

你不需要一个不同的线程,你的ctx变量可能是导致它的那个,尝试使用getApplicationContext(),这应该有效:

import android.widget.Toast;

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

也许这可以帮助您。

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

答案 5 :(得分:-1)

你可以这样做。

((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是您的活动

我希望这会对你有所帮助。