Тост в предпочтении. Предпочтение проявляется поздно

StackOverflow https://stackoverflow.com/questions/3595905

Вопрос

Я хочу показать тост сразу после того, как пользователь нажимает на CheckBoxPreference в моих предпочтениях.

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

Я также пытался поставить тост в метод дошутного (), но он всегда показан после весь метод обрабатывается. Я старался getBaseContext() вместо Prefs.this, но это не помогло. Любая идея, почему тост не появляется одновременно и как сделать это сделать это?

Это было полезно?

Решение

Это происходит потому, что 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 называется. Также, если doSomething Продолжительно работает, он монополизирует вашу ui поток и может вызвать возможную силу ANR Close. Вы можете подумать о запуске doSomething в ан AsyncTask Если это займет более 150 мс или около того.

Другие советы

Мое решение использует трансляцию и сделать приемник, зарегистрированный в Android Mailest.

В AndroidManifest:

    <receiver android:name=".MyReceiver" >
        <intent-filter >
            <action android:name="showtoast" />
        </intent-filter>
    </receiver>

Отправка трансляции:

public static void BroadcastMessage(Context context, Bundle extra)
{
    Intent intent = new Intent();
    intent.setPackage(context.getPackageName());
    intent.setAction("showtoast");
    if (extra != null)
        intent.putExtras(extra);
    context.sendBroadcast(intent);
}

приемник как ниже:

public class MyReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if ("showtoast".equalsIgnoreCase(intent.getAction()) && (bundle != null)
        {
            String title = bundle.getString("title", "");

            View view;
            TextView mTextView;
            LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.my_toast_layout, null);
            mTextView = (TextView) view.findViewById(R.id.tv_title);
            mTextView.setText(title);

            Toast toast = new Toast(context.getApplicationContext());
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.setView(view);
            toast.setDuration(Toast.LENGTH_LONG);
            toast.show();
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top