Intereting Posts
Вход в Android в моем приложении с учетными данными google Не удалось выполнить тестовый прогон: прорыв инструментария из-за «сбоя процесса». При тестировании нескольких действий в Android Поздний рендеринг веб-браузера Android Android getExternalCacheDir () возвращает null Android – добавление хотя бы одного действия с фильтром намерений ACTION-VIEW после обновления версии SDK версии 23 Android: установить высоту DrawableLeft в textView Как получить положение Touch в андроиде? В чем смысл «кода» в ошибке сегментации Чтение названий активности из файла apk в Android Импорт com.google.android.gms.location.LocationClient не может быть разрешен после форматирования компьютера Можно ли добавить какой-либо элемент в контекстные меню андроида (системное меню) Android stackoverflow с использованием цикла while Установки Android set () и setExact () срабатывают с неправильными интервалами Как удалить папки в sdcard файлового обозревателя в android Как долго приложение может быть одобрено для Amazon AppStore?

Ошибка вызова тоста из службы Android

Возможный дубликат:
Android Toast начался с сервиса только один раз

Я использую службу Android, определенную в android.app.Service.

Я вызываю эту службу (myService) из Activity.

MyService:

public class myService extends Service{ public IBinder onBind(Intent intent){ return null; } public void onCreate(){ super.onCreate(); TimerTask task = new TimerTask(){ public void run(){ Log.i("test","service running"); checkDate(); } }; timer = new Timer(); timer.schedule(task, 0, 20000); } public void checkDate(){ Toast toast = Toast.makeText(this, "SIMPLE MESSAGE!", Toast.LENGTH_LONG); toast.show(); } } 

Метод checkDate () находится в классе myService.

Произошла ошибка:

  09-19 15:41:35.267: E/AndroidRuntime(2026): FATAL EXCEPTION: Timer-0 09-19 15:41:35.267: E/AndroidRuntime(2026): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 09-19 15:41:35.267: E/AndroidRuntime(2026): at android.os.Handler.<init>(Handler.java:121) 09-19 15:41:35.267: E/AndroidRuntime(2026): at android.widget.Toast$TN.<init>(Toast.java:310) 09-19 15:41:35.267: E/AndroidRuntime(2026): at android.widget.Toast.<init>(Toast.java:84) 09-19 15:41:35.267: E/AndroidRuntime(2026): at android.widget.Toast.makeText(Toast.java:226) 

Solutions Collecting From Web of "Ошибка вызова тоста из службы Android"

TimerTask работает в отдельном потоке. Toast.makeText() должен быть выполнен из потока, который установил Handler/Looper . В основном это означает, что вам нужно сделать тост в потоке, в котором работает стандартный диспетчер сообщений / событий Android.

Самый простой способ сделать это можно в checkDate() :

 runOnUiThread(new Runnable() { public void run() { Toast toast = Toast.makeText(this, "SIMPLE MESSAGE!", Toast.LENGTH_LONG); toast.show(); } }); 

EDIT: Я идиот, это неправильно. Вы не можете вызвать runOnUiThread () из контекста службы

Для этого вам нужно использовать Handler. В вашем сервисе:

 private Handler handler; 

В onCreate() вашего сервиса:

 handler = new Handler(); 

В checkDate() :

 handler.post(new Runnable() { public void run() { Toast toast = Toast.makeText(myService.this, "SIMPLE MESSAGE!", Toast.LENGTH_LONG); toast.show(); } }); 

Вы называете это из рабочего потока. Вам нужно вызвать Toast.makeText () (и большинство других функций, связанных с пользовательским интерфейсом) из основного потока. Например, вы можете использовать обработчик.

Вам нужно вызвать Toast.makeText (…) из потока пользовательского интерфейса:

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