尝试显示Toast时的上下文问题

时间:2010-09-13 19:26:43

标签: java android toast android-context

我尝试在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,但结果相同。

2 个答案:

答案 0 :(得分:2)

将其包裹到runOnUIThread方法中:

runOnUiThread(new Runnable() {
    public void run() {
        Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show();
    }
});

那是因为{1}}方法没有在UI线程上执行,所以你必须强迫它。

答案 1 :(得分:0)

你必须使用

MyObject.this 

在AsyncTask内部