1

ユーザーが PreferenceActivity の CheckBoxPreference をクリックした直後にトーストを表示したいと考えています。

myCheckBox.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(Prefs.this,
                        "test",
                        Toast.LENGTH_SHORT).show();
                doSomething();
                return false;
            }
        });

また、トーストを doSomething() メソッドに入れようとしましたが、メソッド全体が処理された後に常に表示されます。getBaseContext()の代わりに試してみましたがPrefs.this、役に立ちませんでした。トーストがすぐに表示されない理由と、その方法を教えてください。

4

2 に答える 2

3

これは、onPreferenceClickリスナーが UI スレッドで実行されているために発生しています。このスレッドは、 の表示を処理するスレッドとも同じToastです。Toast#showメッセージキューにメッセージをプッシュするだけで、コードを実行してToast表示します。onPreferenceClickそのキューは、ハンドラーが完全に終了するまで処理されません。

あなたが試すことができます:

myCheckBox.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(Prefs.this,
                        "test",
                        Toast.LENGTH_SHORT).show();

                Prefs.this.runOnUiThread(new Runnable() {
                    @Override
                        public void run() {
                            doSomething();
                        }
                    });
                return false;
            }
    });

これにより、Toastがメッセージ キューにポストdoSomethingされ、トーストの後にキューにもポストされます。doSomethingこれの欠点は、が呼び出される前に処理される UI メッセージが存在する可能性があることです。また、doSomething実行時間が長いと、UI スレッドが独占され、ANR の強制終了が発生する可能性があります。150 ミリ秒以上かかる場合は、実行doSomethingを検討することをお勧めします。AsyncTask

于 2010-08-29T18:49:35.733 に答える