3

ここで誰かがオンラインで同様の問題を抱えていることを発見しました。

これは機能しません:

Timer t = new Timer(false);
t.schedule(new TimerTask() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "msg", Toast.LENGTH_LONG).show();
}
}, 5000);

しかし、タイマータスクの外側でトーストをインスタンス化し、それを内側に表示すると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。これを行う適切な方法は、新しいスレッドを開始しない HandlerHandlerのメソッドを使用して呼び出すことです。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);
于 2012-04-27T14:17:20.583 に答える
0

アプリケーションを起動するたびに、UI スレッド (メイン スレッドとも呼ばれます) で起動します。

定義上、新しいスレッド、タイマー、または AsyncTask を作成すると、新しいスレッドが作成されます。メイン スレッドではないスレッドには、UI を変更する権限がありません。

于 2012-07-08T12:43:17.893 に答える