简体   繁体   English

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

[英]How to show toast message from background thread

Consider the following code.考虑以下代码。 In Service.onStart() method i have created and started a thread that should show Toast message but it is not working!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();
            }
}

Do UI stuffs in main/UI thread.在主/UI 线程中做 UI 的事情。 Try this:试试这个:

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

handler.post(new Runnable() {

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

I have written a class for showing Toasts from background processes.我写了一个类来显示来自后台进程的Toasts Can be used everywhere, eg in an AsyncTask .可以在任何地方使用,例如在AsyncTask You only have to create an instance of this class like您只需要创建此类的一个实例,例如

ToastHandler mToastHandler = new ToastHandler(yourContext);

and then call showToast() with your text or resource id and the Toast's duration like you normally would with makeToast() .然后调用showToast()用文字或资源ID和Toast's持续时间就像你通常会用makeToast()

Here is the code or the direct download link :这是代码或直接下载链接

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);
    }
}

You should be able to use the getApplicationContext() method to get the context with which to show the Toast.您应该能够使用 getApplicationContext() 方法来获取用于显示 Toast 的上下文。

See getApplication() vs. getApplicationContext() for some nice discussion on this.请参阅getApplication() 与 getApplicationContext()以了解有关此问题的一些很好的讨论。

replace word this with getApplicationContext() The message will then appeargetApplicationContext()替换单词this然后会出现消息

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

the correct :正确的 :

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

You can't show a Toast on a thread that is not the activity's ui thread.您不能在不是活动的 ui 线程的线程上显示 Toast。
you can only run it somewhere else if you use runOnUiThread method so that it runs on the ui thread如果您使用runOnUiThread方法,则只能在其他地方运行它,以便它在 ui 线程上运行

Look at this question看看这个问题
Android: Toast in a thread Android:在线程中吐司

We use handler for this purpose because it is easy... :)我们为此目的使用处理程序,因为它很容易...... :)

Steps:脚步:

  1. declare a handler in the main activity (onCreate)在主活动(onCreate)中声明一个处理程序
  2. a class which is to be run in the background in that create a parameterized constructor .一个在后台运行的类,它创建一个参数化的构造函数。 Taking the Context a perimeter .以 Context 为边界。
  3. now create a thread from the main activity and pass the Context of that activity.现在从主活动创建一个线程并传递该活动的上下文。
  4. now Post to the handler from that another thread (from whichever thread u want to send)现在从另一个线程发布到处理程序(从你想发送的任何线程)
  5. now use this context in the Toast, instead of using getApplicationContext()现在在 Toast 中使用此上下文,而不是使用 getApplicationContext()

It runs well.它运行良好。

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

getBaseContext()替换this

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM