我的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();
您需要使用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
您可能没有实例化您的ctx变量,因此您将获得NULL指针。
您不应该将此内容放入线程中,这实际上是一个非常糟糕的主意(知道您刚刚入门)。
执行:adb logcat
以查看您的日志输出。
您不需要其他线程,您的ctx变量可能是导致该线程的那个,请尝试使用getApplicationContext(),这应该可以工作:
import android.widget.Toast;
Toast.makeText(getApplicationContext(), "Login Failed", Toast.LENGTH_LONG).show();
只有主线程才能更改UI。这就是您的应用程序崩溃的原因。在主线程上进行工作,如果您正在做网络或IO等繁重的工作,则应使用AsyncTask
,因为每个线程都有5秒的响应时间。
也许这可以帮助您。
runOnUiThread(()->Toast.makeText(this,"I am a Toast message",Toast.LENGTH_SHORT).show());
您可以这样操作。
((Button)findViewById(R.id.myButton)).setOnClickListener(new OnClickListener(){
public void onClick(View v) {
Toast.makeText(MyActivity.this, "Login Failed", Toast.LENGTH_LONG).show();
}
});
位置:
我希望这会对您有所帮助。