在服务的主题中显示Toast

时间:2014-12-08 14:46:48

标签: android multithreading service toast

嗨,我知道这个话题有很多答案。但我尝试了很多,但它没有用。我想在服务的一个线程中显示一个吐司。我怎么解决这个问题。使用getApplicationContext()等并不起作用。

我从一个Activity(无边界)启动服务。

public class CarDataService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    ...
    startThreadUpdatingDatabase();
    Toast.makeText(this, message, Toast.LENGTH_LONG).show(); //it works
    }

    private void startThreadUpdatingDatabase(){
        Log.d("Database", "startThreadUpdatingDatabase(was called)");
        new Thread(new Runnable() { 
            public void run(){
                ..
                // here i want to use a toast!!!
            }
        }).start();
    }

}

谢谢!

4 个答案:

答案 0 :(得分:1)

你必须开始这个主题:

new Thread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(),"Your message",Toast.LENGTH_LONG).show();
            }
   }).start();

答案 1 :(得分:1)

public Contect context;

成员变量

onStartCommand(){
context = getApplicationContext)
}

在启动线程

之前获取对上下文的引用
 new Thread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context,"Your message",Toast.LENGTH_LONG).show();
                }
       }).start();

然后你去了

使用AsyncTask代替上下文管理

http://www.androidsnippets.com/use-toast-wherever-you-want

答案 2 :(得分:1)

使用UI-Thread显示你的Toast

new Thread(new Runnable() {
    @Override
    public void run() {

        // SHOW TOAST
        activity.runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(yourContext, "Hello from UI-thread", Toast.LENGTH_SHORT).show();
            }
        });

        //... start DB work

    }
}).start();

如果您无权访问某项活动,请按以下方式进行:

new Thread(new Runnable() {
    @Override
    public void run() {

        // no activity, so use Handler & mainlooper
        new Handler(Looper.getMainLooper()).post(
            new Runnable() {
                public void run() {
                    // yourContext is Activity or Application context
                    Toast.makeText(yourContext, "Hello from UI-thread", Toast.LENGTH_SHORT).show();
                }
             }
        );

        //... start DB work

    }
}).start();

看看这个:Static Way to get Context on android?

答案 3 :(得分:1)

 Handler h = new Handler(context.getMainLooper());

    h.post(new Runnable() {
        @Override
        public void run() {
             Toast.makeText(context,message,Toast.LENGTH_LONG).show();
        }
    });

看看这是否成功