我的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();
答案 0 :(得分:10)
您需要使用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
答案 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();
}
});
其中:
我希望这会对你有所帮助。