问题
I have an onClick event in my android app that triggers the following code but it keeps crashing my app. I put it in a thread only because i read that that's supposed to prevent crashing. Also ctx refers to the Activity's context (it's a variable I created in the activity set equal to this. I've read and tried several things. Any help would be awesome. Thanks!
Thread toastThread = new Thread() {
public void run() {
Toast alertFailure = Toast.makeText(ctx, "Login Failed", Toast.LENGTH_LONG);
alertFailure.show();
}
};
toastThread.start();
回答1:
You need to use runOnUiThread
Something like
runOnUiThread(new Runnable() {
public void run()
{
Toast.makeText(ctx, toast, Toast.LENGTH_SHORT).show();
}
});
}
Toast
is a UI
element so it needs to run on the UI Thread
, not a background Thread
.
However, if this is all you are using it for then you don't need a separate Thread
just to show a Toast
. If you can explain the context of how you are using it then maybe we can help with a better way. Also, if you are inside of your Activity
then you don't need a variable for Context
. You can use ActivityName.this
instead to access the Activity Context
回答2:
You likely don't have your ctx variable instantiated, so you are getting NULL Pointer.
You should not put this in a Thread, and is actually a pretty bad idea (knowing you are just getting started).
execute: adb logcat
to see your log output.
回答3:
You don't need a different thread, your ctx variable is probably the one causing it, try using getApplicationContext(), this should work:
import android.widget.Toast;
Toast.makeText(getApplicationContext(), "Login Failed", Toast.LENGTH_LONG).show();
回答4:
Only the mainthread can change the UI. That's why your application crashes. Do your work on the mainthread, and if you are doing something heavy like network or IO, you should use AsyncTask
because each thread has 5 seconds to respond.
回答5:
You can do this like this.
((Button)findViewById(R.id.myButton)).setOnClickListener(new OnClickListener(){
public void onClick(View v) {
Toast.makeText(MyActivity.this, "Login Failed", Toast.LENGTH_LONG).show();
}
});
Where:
- myButton is the id of your view
- myActivity is your activity
I hope this will help you.
来源:https://stackoverflow.com/questions/17410734/toast-is-crashing-application-even-inside-thread