Проблемы с контекстом при попытке отобразить тост - PullRequest
3 голосов
/ 13 сентября 2010

Я пытаюсь отобразить тост внутри AsyncTask. Этот первый фрагмент кода помещен в действие, которое мы можем назвать 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() и cxt.getApplicationContext() вместо cxt, но с тем же результатом.

Ответы [ 2 ]

2 голосов
/ 13 сентября 2010

Оберните это в runOnUIThread метод:

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

Это потому, что метод doInBackground не выполняется в потоке пользовательского интерфейса, поэтому вы должны принудительно применить его.

0 голосов
/ 14 сентября 2010

Вы должны использовать

MyObject.this 

внутри AsyncTask

...