Java 尝试显示Toast时出现上下文问题
我尝试在异步任务中显示一个祝酒词。 这第一段代码放在一个我们可以称之为Java 尝试显示Toast时出现上下文问题,java,android,toast,android-context,Java,Android,Toast,Android Context,我尝试在异步任务中显示一个祝酒词。 这第一段代码放在一个我们可以称之为MyActivity的活动中,工作正常: Toast.makeText(this, "Toast!", Toast.LENGTH_SHORT).show(); 然后我创建一个新的MyObject实例,并调用method()。此代码也位于MyActivity中 MyObject obj = new MyObject(this); obj.method(); 这是MyObject的定义。ProgressDialog工作正常,但
MyActivity
的活动中,工作正常:
Toast.makeText(this, "Toast!", Toast.LENGTH_SHORT).show();
然后我创建一个新的MyObject
实例,并调用method()
。此代码也位于MyActivity
中
MyObject obj = new MyObject(this);
obj.method();
这是MyObject
的定义。ProgressDialog工作正常,但没有显示祝酒词
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
}
}
}
公共类MyObject{
上下文cxt;
公共MyObject(上下文cxt){
this.cxt=cxt;
}
公开作废法(){
新建MyAsyncTask().execute();
}
私有类MyAsyncTask扩展了AsyncTask{
受保护的void onPreExecute(){
Toast.makeText(cxt,“Toast!”,Toast.LENGTH_SHORT.show();//工作正常
}
受保护的布尔doInBackground(对象…参数){
Looper.prepare();
Toast.makeText(cxt,“Toast!”,Toast.LENGTH_SHORT).show();//不起作用
}
}
}
我相信在我的第一个例子和下面的例子中,我做了完全相同的事情,但显然,我遗漏了一些东西。我还尝试了
getApplicationContext()
和cxt.getApplicationContext()
而不是cxt
,但结果相同。将其包装到runOnUIThread
方法中:
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show();
}
});
这是因为doInBackground
方法没有在UI线程上执行,所以必须强制执行。必须使用
MyObject.this
在AsyncTask内部您不应该使用
new
创建活动的新实例对不起,我通常不会这样做。我只是将我的常规代码重新编写成一个更好的示例,没有考虑它。但是谢谢你的观点!:)