6

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

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

6 回答 6

12

您需要使用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

于 2013-07-01T18:05:39.873 回答
0

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

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

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

于 2013-07-01T18:04:20.983 回答
0

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

import android.widget.Toast;

Toast.makeText(getApplicationContext(), "Login Failed", Toast.LENGTH_LONG).show();
于 2013-07-01T18:06:19.903 回答
0

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

于 2013-07-01T18:10:54.780 回答
0

也许这个可以帮助你。

runOnUiThread(()->Toast.makeText(this,"I am a Toast message",Toast.LENGTH_SHORT).show());
于 2019-12-05T15:45:19.217 回答
-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 是你的活动

我希望这能帮到您。

于 2013-07-01T18:17:09.397 回答