Intereting Posts
Запретить Proguard удалять пустой конструктор фрагмента Получить выбранный элемент из списка ListView с помощью SimpleCursorAdapter Невозможно применить системную яркость экрана программно в Android Как отключить всплывающее окно клавиатуры, когда на edittext? Custom Checkable View, который отвечает Selector Java.lang.NoClassDefFoundError: тесты android и junit Android 4.2.2 Отладка USB-опции «Всегда разрешать с этого компьютера» приводит к неизвестной цели для устройства? Как создать меню мини-ящика в Android? Подключено мобильное устройство (Android) в качестве MTP, теперь мы можем получить доступ к этому устройству и получить время Ошибка @Override аннотации (андроидные prefs) Как организовать исходный код Android в папки Как разрешить пользователю выбирать текстовый диапазон в TextView (аналогично EditText) Операция обновления в Realm Ошибка Runtime.exec (): зависает без предоставления объекта Process Метод onPreferenceChange не вызывается при изменении Listpreferences

Ошибка вызова тоста из службы 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(); } });