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