在timertask中使用toast

时间:2012-04-27 14:12:35

标签: android

发现某人在线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线程有关,

但究竟是怎么回事?

4 个答案:

答案 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