Поднять тост из AsyncTask - PullRequest
       3

Поднять тост из AsyncTask

5 голосов
/ 22 марта 2011

Я пытаюсь поднять тост из асинктической задачи, но у меня проблемы с настройкой параметров. Я тост из onProgressUpdate, так что я нахожусь в потоке пользовательского интерфейса, который я считаю правильным. Я думаю, что неправильно с параметром context, что я должен передать в качестве значения?

РЕДАКТИРОВАТЬ: показ кода ниже

    @Override
protected void onProgressUpdate(String... strings){
    Toast toast = Toast.makeText(MainActivity.this, strings[0], Toast.LENGTH_LONG);
    toast.show();
}

MainActivity.this говорит: «Ни один включающий экземпляр типа MainActivity не доступен в области». Я не уверен, что вместо этого передать в качестве контекста.

Спасибо

Ответы [ 3 ]

4 голосов
/ 22 марта 2011

Получите объект Context, вызвав getApplicationContext() из MainActivity и передайте его в качестве параметра вашему AsyncTask. Как отметил EboMike, MainActivity.this будет работать только в том случае, если ваш AsyncTask был внутренним классом.

2 голосов
/ 22 марта 2011

Если это не внутренний класс, объявленный в точке использования, то MainActivity.this, вероятно, выйдет из области видимости. Единственный способ устранить проблему - это создать подкласс AsyncTask и изменить конструктор так, чтобы он принимал переменную контекста, чтобы вы могли установить ее в своем пользовательском классе и использовать ее из методов. Использование getApplicationContext также может работать, но я не уверен, как оно будет себя вести.

0 голосов
/ 29 октября 2011

Вы не можете сделать это в onProgressUpdate(). По крайней мере, не так. Если Eclipse выдает эту ошибку, это потому, что MainActivity.this для него неразрешима. Зачем? Поскольку вы НЕ участвуете в потоке пользовательского интерфейса, то, что вы делаете, не является потокобезопасным, поскольку вы не должны получать доступ к пользовательскому интерфейсу из другого потока.

Прежде всего, и как уже было сказано, вы должны написать конструктор, который берет контекст и сохраняет его в глобальной переменной, чтобы он был доступен везде внутри класса. Затем, чтобы получить доступ к пользовательскому интерфейсу потокобезопасным способом, используйте одно из следующего:

Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)

Это поточно-ориентированные.

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...