如何显示来自后台线程的吐司消息

考虑下面的代码。 在Service.onStart()方法中,我创build并启动了一个应该显示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(); } } 

Solutions Collecting From Web of "如何显示来自后台线程的吐司消息"

在主/ UI线程中做UI的东西。 尝试这个:

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

我已经写了一个从后台进程显示Toasts的类。 可以随处使用,例如在AsyncTask 。 你只需要创build这个类的一个实例

 ToastHandler mToastHandler = new ToastHandler(yourContext); 

然后调用showToast()与您的文本或资源ID和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(),以获得一些关于此的良好讨论。

getBaseContext()replacethis

您不能在不是活动的UI线程的线程上显示Toast。
如果使用runOnUiThread方法,只能在ui线程上运行,则只能在其他位置运行

看看这个问题
Android:在一个线程中吐司