Raising a Toast From AsyncTask
I'm trying to raise a toast from asynctask, but I'm having trouble getting my parameters right. I'm toasting from onProgressUpdate, so I'm on the UI thread, which I think is correct. I think I'm going wrong with the context parameter, what should I pass in as a value?
EDIT: Showing code below
@Override
protected void onProgressUpdate(String... strings){
Toast toast = Toast.makeText(MainActivity.this, string开发者_开发问答s[0], Toast.LENGTH_LONG);
toast.show();
}
MainActivity.this is saying "No enclosing instance of the type MainActivity is accessible in scope." I'm not sure what to pass as a context instead.
Thanks
Get the Context
object by calling getApplicationContext()
from MainActivity
and pass it as a parameter to your AsyncTask
. As EboMike has pointed out, MainActivity.this
would only work if your AsyncTask
was an inner class.
If it's not an inner class declared at the point of use then MainActivity.this
is likely to be out of scope. The only way to remedy the problem is to subclass AsyncTask
and change the constructor to accept a context variable so you can set it in your custom class and use it from methods. Using getApplicationContext
might work as well but I'm not sure how it will behave.
You can NOT do this in onProgressUpdate()
. At least not this way. If Eclipse gives you this error, it is because MainActivity.this is unresolvable for it. Why? Because you are NOT in the UI Thread, so what you do is not thread-safe, because you must not access UI from another Thread.
First of all, and as told before, you should write a constructor taking a context and saving it to a global variable, so it is accessible everywhere inside the class. Then, to access UI in a thread-safe way, use one of the following:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Those are thread-safe.
Regards
精彩评论