Тост в предпочтении. Предпочтение проявляется поздно
-
02-10-2019 - |
Вопрос
Я хочу показать тост сразу после того, как пользователь нажимает на 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();
}
}
}