3

我尝试在 AsyncTask 中显示 Toast。第一段代码放在我们可以调用的活动中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
        }
   }
}

我相信在我的第一个示例和下面的示例中我正在做完全相同的事情,但显然我遗漏了一些东西。我也尝试过getApplicationContext()andcxt.getApplicationContext()而不是cxt,但结果相同。

4

2 回答 2

2

将其包装到runOnUIThread方法中:

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

那是因为该doInBackground方法没有在 UI 线程上执行,所以你必须强制执行。

于 2010-09-13T19:36:36.147 回答
0

你必须使用

MyObject.this 

在 AsyncTask 内部

于 2010-09-13T20:28:25.160 回答