Toast导致应用程序崩溃,即使在线程内部

问题描述 投票:3回答:6

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

Thread toastThread = new Thread() {
  public void run() {
    Toast alertFailure = Toast.makeText(ctx, "Login Failed", Toast.LENGTH_LONG);
    alertFailure.show();
  }
};
toastThread.start();
android toast
6个回答
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


0
投票

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

您不应该将此内容放入线程中,这实际上是一个非常糟糕的主意(知道您刚刚入门)。

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


0
投票

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

import android.widget.Toast;

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

0
投票

只有主线程才能更改UI。这就是您的应用程序崩溃的原因。在主线程上进行工作,如果您正在做网络或IO等繁重的工作,则应使用AsyncTask,因为每个线程都有5秒的响应时间。


0
投票

也许这可以帮助您。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.