Found someone has similar issue online here.
This doesn\'t work:
Timer t = new Timer(false);
t.schedule(new TimerTask() {
@Override
public void run()
Everytime you start an application, it starts on the UI Thread (also called the Main Thread).
Whenever you create a new Thread, or Timer, or AsyncTask, by definition, they're creating new Threads. Threads that aren't the main thread simply don't have permission to modify the UI.
try this
Timer t = new Timer(false);
t.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "msg", Toast.LENGTH_LONG).show();
}
});
}
}, 5000);
Toast use on UIThread. You can by Handler or runOnUiThread
Using Timer starts a new thread, I suppose that thread does not have access to getApplicationContext
. The proper way to do it is to use Handler
and call the postDelayed
method of the Handler - which does not start a new thread.
Read about this: http://developer.android.com/resources/articles/timed-ui-updates.html
The link you posted has a working example, which is the proper way to do it:
final Context ctx = this;
Handler mHandler = new Handler();
Runnable
makeToast = new Runnable() {
public void run() {
Toast.makeText(ctx, "msg", Toast.LENGTH_LONG).show();
}
};
mHandler.postDelayed(makeToast, 1000);