Отправка тостового сообщения из ветки - PullRequest
11 голосов
/ 18 ноября 2010

Мое приложение запускает поток для запроса данных в Интернете. Я хочу отобразить сообщение Toast, когда ничего не найдено, но мое приложение всегда падает.

Я пытался использовать контекст приложения из потока, например:

Toast.makeText(getApplicationContext(), "testttt", Toast.LENGTH_LONG).show();

Я также попытался создать Runnable с вызовом Toast и вызвать runOnUiThread (runnable) из потока (вызов Toast в этом runnable использует Activity в качестве первого параметра).

У кого-нибудь есть идеи, как этого добиться?

Ответы [ 4 ]

22 голосов
/ 18 ноября 2010

Попробуйте разместить внутри объекта Handler.

final Handler mHandler = new Handler();
final Runnable mUpdateResults = new Runnable() {
    public void run() {
        Toast(this, message, duration).show();
    }

new Thread() {
    public void run() {
        mHandler.post(mUpdateResults);
    }
}.start();
4 голосов
/ 18 ноября 2010

Toast.makeText().show() определенно должен быть запущен в потоке пользовательского интерфейса.

Вы, вероятно, должны использовать AsyncTask, как упомянуто Октавианом Дамианом, но вот некоторый код, использующий runOnUiThread, если вы используете его:*

    public void showToastFromBackground(final String message) {
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        }
    });
}
3 голосов
/ 18 ноября 2010

Попробуйте реализовать класс, расширяющий "Обработчик" в вашем классе Activity, и отправьте ему сообщение из другого потока.Более подробно объяснено здесь:

http://www.anddev.org/the_pizza_timer_-_threading-drawing_on_canvas-t126.html

И, пожалуйста, при задании такого вопроса включайте трассировку стека, которую вы получаете.

1 голос
/ 22 июля 2011

Если вы запускаете обработчик из своего класса Activity, вы можете установить контекст, просто ссылаясь на .this вашей Activity следующим образом:

final Runnable showToastMessage = new Runnable() {
    public void run() {
        Toast.makeText(YourActivity.this, "Message", Toast.LENGTH_SHORT).show();
    }
};
...