发现某人在线here有类似问题。
这不起作用:
Timer t = new Timer(false);
t.schedule(new TimerTask() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "msg", Toast.LENGTH_LONG).show();
}
}, 5000);
但是如果我在timertask之外实例化toast然后在run
内显示它,它就可以工作。
我认为它可能与所谓的UI线程有关,
但究竟是怎么回事?
答案 0 :(得分:9)
试试这个
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);
答案 1 :(得分:1)
使用Timer启动一个新线程,我想该线程无法访问getApplicationContext
。正确的方法是使用Handler
并调用Handler的postDelayed
方法 - 它不会启动新线程。
了解这一点:http://developer.android.com/resources/articles/timed-ui-updates.html
您发布的链接有一个工作示例,这是正确的方法:
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);
答案 2 :(得分:0)
每次启动应用程序时,它都会在UI线程(也称为主线程)上启动。
无论何时创建新的Thread,Timer或AsyncTask,根据定义,他们都会创建新的Threads。非主线程的线程无权修改UI。
答案 3 :(得分:0)
在UIThread上吐司使用。您可以通过Handler或runOnUiThread