Android: сниппет для тостов

Toast прекрасный способ оповестить пользователя о чем то, не блокируя интерфейс. У них можно завадать отзывы, показывать в разных местах и даже делать кастомные view и все это с помощью fluent interface. Уверен, что читатели если и слышали о таких расширенных возможностях, то никогда не пользовались этим. Самый стандартный юзкейс – показать текст.

По моему опыту часто нужно показать toast как результат не успешной процедуры, которая обычно выполняется в фоне в отдельном треде или воркере, т.е. не в UI. А для этого приходится писать лапшу только для того, Toast.makeText(…).show() выполнился в UI треде.

Для этого набросал сниппет, который уменьшит количество кода и ошибки, связанные с вызовом тоста из нетого потока и банальному забыванию метода show().

Было

Toast.makeText(this,
getText(R.string.messages_storage_invalid),
Toast.LENGTH_SHORT).show();

Стало

toastShort(R.string.messages_storage_invalid);

Причем метод можно вызывать из любого потока. Показыватся тост будет из UI треда через runnable

Для этого в базовом классе (для всех activity), а я надеюсь он у вас есть, иначе java особо раздражает из за невозможности добавить поведения(или множественное насследование) нужно описать следующее:

public abstract class BaseActivity extends Activity {
private Handler mHandler = new Handler();

/**
* Shortcut for makeToast
* @param str to display
*/
public void toastLong(final String str) {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(BaseActivity.this, str, Toast.LENGTH_LONG).show();
}
});
}

/**
* Shortcut for makeToast with i18n
* @param stringResId to display
* @param args argument for format if any
*/
public void toastLong(final int stringResId, Object... args) {
toastLong(getString(stringResId, args));
}

/**
* Shortcut for makeToast short
* @param str to display
*/
public void toastShort(final String str) {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(BaseActivity.this, str, Toast.LENGTH_SHORT).show();
}
});
}

/**
* Shortcut for makeToast short with i18n
* @param stringResId to display
* @param args argument for format if any
*/
public void toastShort(final int stringResId, Object... args) {
toastShort(getString(stringResId, args));
}
}