我尝试在AsyncTask中显示Toast。
第一段代码放在我们称之为MyActivity
的活动中,并且工作正常:
Toast.makeText(this, "Toast!", Toast.LENGTH_SHORT).show();
然后我创建MyObject
的新实例并调用method()
。此代码也放在MyActivity
。
MyObject obj = new MyObject(this);
obj.method();
这是MyObject
的定义。 ProgressDialog工作正常,但没有显示toast。
public class MyObject {
Context cxt;
public MyObject(Context cxt) {
this.cxt = cxt;
}
public void method() {
new MyAsyncTask().execute();
}
private class MyAsyncTask extends AsyncTask<Object, Integer, Boolean> {
protected void onPreExecute() {
Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show(); // works fine
}
protected Boolean doInBackground(Object... params) {
Looper.prepare();
Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show(); // doesn't work
}
}
}
我相信我在第一个例子和下面做的事情完全相同,但显然,我错过了一些东西。我也尝试了getApplicationContext()
和cxt.getApplicationContext()
而不是cxt
,但结果相同。
答案 0 :(得分:2)
将其包裹到runOnUIThread
方法中:
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show();
}
});
那是因为{1}}方法没有在UI线程上执行,所以你必须强迫它。
答案 1 :(得分:0)
你必须使用
MyObject.this
在AsyncTask内部