Проблемы с контекстом при попытке отображать тост

StackOverflow https://stackoverflow.com/questions/3703674

Вопрос

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

Это было полезно?

Решение

Обернуть это в runOnUIThread Метод:

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

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

Другие советы

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

MyObject.this 

Внутри асинктаски

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top