2010-09-19 34 views
0

我试图在BroadcastReceiver收到事件后的一段时间向用户显示一条消息。从BroadcastReceiver显示延迟的Toast

public class MyReceiver extends BroadcastReceiver { 

    private Timer timer = new Timer(); 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Display message in 10 sec. 
     timer.schedule(new MessageTask(context, "Test Message"), 10 * 1000); 
    } 

    private static class MessageTask extends TimerTask { 
    public MessageTask(Context context, String message) { 
     this.context = context; 
     this.message = message; 
    } 

    public void run() { 
     Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
    } 
    } 
} 

当我运行此我得到以下异常:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

这是做这样的事情的正确方法?我应该使用其他的定时器吗?在这种情况下获取Context对象的正确方法是什么?

谢谢

回答

1

通过张贴由凯文·戈丹波纹管的例子的指导下,我认识到,为了与来自不同的线程的UI交互,需要手动管理的Android消息循环。

在伪,这看起来是这样的:

import android.content.Context; 
import android.os.Looper; 

public class MyUIThread extends Thread { 

    public MyUIThread(Context context) { 
     // Probably going to need a context to do anything useful. So 
     // pass it in. 
     this.context = context; 
    } 

    public void run() { 
     Looper.prepare(); 
     // Do some UI stuff, e.g. Toast.makeText 
     Looper.loop(); 
    } 

} 
0

这是行不通的。一旦你的onReceive()方法完成,手机就可以自由地重新入睡或做任何想要的事情。你必须实施一个唤醒锁。

2

您可以尝试使用my Toaster class。使用它像一个主题:

new Toaster(yourContext, yourMessageResId, Toast.LENGTH_LONG).start();