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