如何从后台线程显示吐司消息

时间:2011-09-11 14:41:04

标签: java android

请考虑以下代码。在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();
            }
}

7 个答案:

答案 0 :(得分:22)

在主/ UI线程中执行UI内容。试试这个:

Handler handler = new Handler(Looper.getMainLooper());

handler.post(new Runnable() {

        @Override
        public void run() {
            //Your UI code here
        }
    });

答案 1 :(得分:9)

我写了一个用于从后台进程中显示Toasts的类。可以在任何地方使用,例如在AsyncTask中。您只需要创建此类的实例,如

ToastHandler mToastHandler = new ToastHandler(yourContext);

然后使用您的文字或资源ID以及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); } } 一样。

以下是代码或直接下载link

{{1}}

答案 2 :(得分:1)

您应该能够使用getApplicationContext()方法来获取显示Toast的上下文。

有关此问题的详细讨论,请参阅getApplication() vs. getApplicationContext()

答案 3 :(得分:1)

将单词this替换为getApplicationContext(),然后出现该消息

Toast.makeText(this, "My Service Created", Toast.LENGTH_SHORT).show();

正确的:

Toast.makeText(getApplicationContext(), "My Service Created", Toast.LENGTH_SHORT).show();

答案 4 :(得分:0)

this代替getBaseContext()

答案 5 :(得分:0)

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

看看这个问题 Android: Toast in a thread

答案 6 :(得分:0)

我们使用处理程序是因为它很容易...:)

步骤:

  1. 在主要活动(onCreate)中声明一个处理程序
  2. 将在后台运行的类,用于创建参数化的构造函数。以上下文为边界。
  3. 现在从主要活动中创建一个线程,并传递该活动的上下文。
  4. 现在从另一个线程(您要发送的那个线程)发布到处理程序中
  5. 现在在Toast中使用此上下文,而不是使用getApplicationContext()

运行良好。

mhandler.post(new Runnable() {
    public void run() {
        Toast.makeText(context,"Run ends",Toast.LENGTH_LONG).show();
    }
});