Как показать сообщение тоста из фонового потока

Рассмотрим следующий код. В методе Service.onStart() я создал и начал поток, который должен показывать сообщение Toast, но он не работает!

 public class MyService extends Service{ private static final String TAG = "MyService"; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Toast.makeText(this, "My Service Created", Toast.LENGTH_SHORT).show(); } @Override public void onDestroy() { Toast.makeText(this, "My Service Stopped", Toast.LENGTH_SHORT).show(); } @Override public void onStart(Intent intent, int startid) { Toast.makeText(this, "My Service Started", Toast.LENGTH_SHORT).show(); DBIteratorThread dbThread=new DBIteratorThread(); dbThread.myService=this; Thread t1 = new Thread(dbThread); t1.start(); } } class DBIteratorThread implements Runnable { MyService myService; public void run() { // Toast.makeText(myService, "Thread is Running", Toast.LENGTH_SHORT).show(); } } 

Делайте файлы UI в основном / пользовательском потоке. Попробуй это:

 Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { //Your UI code here } }); 

Я написал класс для показа Toasts из фоновых процессов. Может использоваться повсеместно, например, в AsyncTask . Вам нужно создать экземпляр этого класса, например

 ToastHandler mToastHandler = new ToastHandler(yourContext); 

А затем вызовите showToast() с текстом или идентификатором ресурса и продолжительностью Toast's как обычно, с makeToast() .

Вот код или ссылка для прямой загрузки:

 import android.content.Context; import android.os.Handler; import android.widget.Toast; /** * A class for showing a <code>Toast</code> from background processes using a * <code>Handler</code>. * * @author kaolick */ public class ToastHandler { // General attributes private Context mContext; private Handler mHandler; /** * Class constructor. * * @param _context * The <code>Context</code> for showing the <code>Toast</code> */ public ToastHandler(Context _context) { this.mContext = _context; this.mHandler = new Handler(); } /** * Runs the <code>Runnable</code> in a separate <code>Thread</code>. * * @param _runnable * The <code>Runnable</code> containing the <code>Toast</code> */ private void runRunnable(final Runnable _runnable) { Thread thread = new Thread() { public void run() { mHandler.post(_runnable); } }; thread.start(); thread.interrupt(); thread = null; } /** * Shows a <code>Toast</code> using a <code>Handler</code>. Can be used in * background processes. * * @param _resID * The resource id of the string resource to use. Can be * formatted text. * @param _duration * How long to display the message. Only use LENGTH_LONG or * LENGTH_SHORT from <code>Toast</code>. */ public void showToast(final int _resID, final int _duration) { final Runnable runnable = new Runnable() { @Override public void run() { // Get the text for the given resource ID String text = mContext.getResources().getString(_resID); Toast.makeText(mContext, text, _duration).show(); } }; runRunnable(runnable); } /** * Shows a <code>Toast</code> using a <code>Handler</code>. Can be used in * background processes. * * @param _text * The text to show. Can be formatted text. * @param _duration * How long to display the message. Only use LENGTH_LONG or * LENGTH_SHORT from <code>Toast</code>. */ public void showToast(final CharSequence _text, final int _duration) { final Runnable runnable = new Runnable() { @Override public void run() { Toast.makeText(mContext, _text, _duration).show(); } }; runRunnable(runnable); } } 

Вы должны использовать метод getApplicationContext (), чтобы получить контекст, с помощью которого можно показать Toast.

См. GetApplication () и getApplicationContext () для приятного обсуждения этого вопроса.

Замените this на getBaseContext() .

Вы не можете показать Toast в потоке, который не является нитью активности.
Вы можете запускать его только в другом месте, если вы используете метод runOnUiThread чтобы он runOnUiThread в потоке ui

Посмотрите на этот вопрос
Android: Тост в потоке

Intereting Posts
Сравнение Layer, Applozic, Quickblox & SendBird для быстрого обмена сообщениями WhatsApp в приложении для Android Почему API, внедренный в Honeycomb, работает на Gingerbread? Firebase (FCM): открывать активность и передавать данные по уведомлению. андроид Разница между OpenCV и OpenCL Есть ли более быстрое решение для рендеринга видео, чем использование функций AndroidBitmap_xxx? Получение данных периферийных устройств Android BLE Не нашел класс по пути: dexpathlist Android: переменная имеет неправильное значение во время цикла Как удалить запись с ORMLITE? GoogleMap CameraUpdate перемещается в неправильные координаты Меню переполнения не отображается в Android 4.2.2 Когда закрыта «потребительская сторона» TextureView? Android Studio и android.support.v4.app.Fragment: не удается разрешить символ Android: screenOrientation? Можете ли вы пойти на пейзаж только на устройствах с высоким разрешением? Попытка mockito издеваться над любым классом генерирует ExceptionInInitializerError