2010-09-19 82 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();