2010-11-17 4 views
11

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

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

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

Я также попытался создать исполняемую с вызовом Toast и вызова runOnUiThread (работоспособный) от Thread (Toast call in this runnable использует Activity как первый параметр).

Есть ли у кого-нибудь идеи о том, как это сделать?

+0

Вы используете 'Thread' как внутренний класс или вы расширяете 'AsyncTask' в совершенно отдельном классе? –

+0

На данный момент я использую класс, который я расширил с Thread. Вероятно, я переведу это в AsyncTask в какой-то момент. Я еще не добрался до него. – Andrew

ответ

22

Try размещать внутрь объекта 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(); 
3

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

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

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

+0

Отмечено; и спасибо, я попробую. – Andrew

4

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

Вы, вероятно, следует использовать AsyncTask как упоминалось Октавиан Damiean, но вот некоторый код, используя runOnUiThread, если вы установите на использовании, что:

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

     @Override 
     public void run() { 
      Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 
+0

Как я уже говорил в своем оригинальном посте, я пробовал это, и он сбой – Andrew

+2

Опубликуйте трассировку стека в исходном посте. –

+0

в коде выше первого параметра «это», вероятно, неверно, вам нужно явно передать действительный контекст, f.i. ваш ProgressDialog.getContent() –

1

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

final Runnable showToastMessage = new Runnable() { 
    public void run() { 
     Toast.makeText(YourActivity.this, "Message", Toast.LENGTH_SHORT).show(); 
    } 
}; 
Смежные вопросы