Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to display toast inside timer?

Tags:

android

toast

I want to display toast message inside timer and I used the following code :

timer.scheduleAtFixedRate( new TimerTask()
{       
public void run()
{
    try {  
        fun1();
        } catch (Exception e) {e.printStackTrace(); }            
    }   
}, 0,60000);    

public void fun1()
{
    //want to display toast
}

And I am getting following error:

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

WARN/System.err(593): at android.os.Handler.(Handler.java:121)

WARN/System.err(593): at android.widget.Toast.(Toast.java:68)

WARN/System.err(593): at android.widget.Toast.makeText(Toast.java:231)

Thanks.

like image 534
Monali Avatar asked Mar 07 '11 10:03

Monali


2 Answers

You can't make UI updates inside separate Thread, like Timer. You should use Handler object for UI update:

timer.scheduleAtFixedRate( new TimerTask() {
private Handler updateUI = new Handler(){
@Override
public void dispatchMessage(Message msg) {
    super.dispatchMessage(msg);
    fun1();
}
};
public void run() { 
try {
updateUI.sendEmptyMessage(0);
} catch (Exception e) {e.printStackTrace(); }
}
}, 0,60000);
like image 166
Olsavage Avatar answered Sep 23 '22 10:09

Olsavage


The easiest way (IMO) is:

new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        final String message = "Hi";
        MyActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MyActivity.this, message, Toast.LENGTH_SHORT).show();
            }
        });
    }
});

The key being MyActivity.this.runOnUiThread(Runnable).

like image 25
JonnyBoy Avatar answered Sep 23 '22 10:09

JonnyBoy