3

在这里发现有人在网上有类似的问题。

这不起作用:

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

4 回答 4

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);
于 2012-04-27T14:15:40.420 回答
1

使用 Timer 启动一个新线程,我想该线程无权访问getApplicationContext. 正确的做法是使用Handler和调用postDelayedHandler 的方法——它不会启动新线程。

阅读: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);
于 2012-04-27T14:17:20.583 回答
0

每次启动应用程序时,它都会在 UI 线程(也称为主线程)上启动。

每当您创建一个新线程、计时器或 AsyncTask 时,根据定义,它们都是在创建新线程。不是主线程的线程根本没有修改 UI 的权限。

于 2012-07-08T12:43:17.893 回答
0

在 UIThread 上使用 Toast。您可以通过 Handler 或 runOnUiThread

于 2020-07-15T07:29:16.537 回答