Почему отображение Toast вне onCreate() приводит к сбою моего приложения?

старый вопрос: «Почему создание Toast приводит к сбою моего приложения?»

Мое приложение работает нормально, если я не использую тосты, но если я хочу создать и показать простой тост, например:

   Toast SimpleToast = Toast.makeText(getApplicationContext(), "Just a toast.",Toast.LENGTH_LONG);
   SimpleToast.setGravity(Gravity.TOP, 0, 0);
   SimpleToast.show();

Я получаю эти строки в журнале, а затем приложение вылетает:

NotificationService   enqueueToast pkg=games.MyAppName callback=android.app.ITransientNotification$Stub$Proxy@49603368 duration=1
ResourceType          No package identifier when getting name for resource number 0x00000000
AndroidRuntime        Shutting down VM
dalvikvm              threadid=3: thread exiting with uncaught exception (group=0x4001b188)
AndroidRuntime        Uncaught handler: thread main exiting due to uncaught exception
AndroidRuntime        java.lang.NullPointerException

Я проверил и дважды проверил приведенный выше код, что приводит к сбою. Я работаю на эмуляторе, так как в настоящее время у меня нет телефона Android.


person Mervin    schedule 20.06.2010    source источник


Ответы (6)


Любые функции, которые считаются «блокирующими», должны создаваться внутри потока. Это включает в себя модальные диалоговые окна, запись в общие настройки, доступ к URL-адресам и, как ни странно, простые всплывающие сообщения.

Эти вещи работают при вызове из onCreate действия, но требуют настройки потока/обработчика, чтобы можно было вызывать из любого места.

person user693375    schedule 14.04.2011
comment
Нет. Не ставьте тосты в треде. В другом потоке они падают - person BeniBela; 10.07.2018

Насколько мне известно, вы не можете показать всплывающее уведомление в контексте приложения, вы должны показать его в контексте действия. Тост не привязан к вашему приложению, он привязан к активности, в которой вы его показываете. Вместо использования getApplicationContext() попробуйте использовать переменную с именем ctx, содержащую ссылку на вашу активность.

Удачи!

person mattbasta    schedule 20.06.2010
comment
В документации говорится, что контекстом обычно является ваш объект Application или Activity. - person Nikola Smiljanić; 20.06.2010
comment
Один только ваш код работает нормально, если он находится в методе onCreate() ванильного действия - так что, возможно, из того места, где вы его вызываете, getApplicationContext() возвращает null или что-то в этом роде (вы можете проверить возвращаемые значения каждого вызова, который вы делаете для отладки). Я бы согласился с mattbasta - сохраните ссылку на свою активность в какой-то переменной и используйте ее. - person Joubarc; 20.06.2010
comment
Кажется, что я получаю сообщение об ошибке всякий раз, когда я вызываю Toast.show() вне метода onCreate(), хотя я на 1000% уверен, что Toast.show() не вызывается до того, как будет выполнено onCreate(). Как я могу это исправить? , я хочу показать всплывающее уведомление из пустоты onclick из прослушивателя onclicklistener, определенного в этом действии. - person Mervin; 20.06.2010
comment
@Mervin: Ваш OnClickListener уже имеет доступ к вашему Activity -- если ваша активность называется Foo, попробуйте Foo.this в качестве Context. Никогда не используйте getApplicationContext() для чего-либо, связанного с пользовательским интерфейсом. - person CommonsWare; 20.06.2010
comment
@CommonsWare: Пожалуйста, прочитайте часть обновления в моем посте, сейчас я создаю тост в onCreate() , но даже использование Toast.Show() в другом месте, чем onCreate(), вызывает сбой. - person Mervin; 20.06.2010
comment
@Mervin: Пожалуйста, прочитайте мой комментарий. Мне все равно, где вы создаете Toast. Не используйте getApplicationContext(). Вот список проектов, демонстрирующих успешное использование Toast в различных местах приложения: github.com/commonsguy/cw-android/tree/master/Messages/Message github.com/commonsguy/cw-android/tree/master/Maps/NooYawk github.com/commonsguy/cw-android/tree/master/Menus/Inflation github.com/commonsguy/cw-android/tree/master/Threads/Asyncer - person CommonsWare; 20.06.2010
comment
.. вздох, мы можем остаться на теме Toast.Show не делает то, что предполагается, если я помещу код в oncreate, все будет работать, если я использую getapplicationcontext или нет, как только я пытаюсь использовать Toast.show() вне onCreate я получаю сообщение об ошибке. - person Mervin; 20.06.2010
comment
@Mervin: Сахар привлекает больше мух, чем уксус. Если вы хотите получить ответ, попробуйте быть немного менее резким. Ты тот, кто просил о помощи. - person mattbasta; 25.06.2010

По какой-то причине getApplicationContext возвращает значение null. Вместо этого попробуйте «ActivityName.this» в методе onClick() внутри прослушивателя.

person Leaudro    schedule 12.08.2010

@Override
public boolean onTouch(View V, MotionEvent event) {
 ...
 Toast toast = Toast.makeText(V.getContext(), ...

где V - ваш вид, будет работать нормально. Вы также можете использовать appConntext() в конструкторах.

person Vlad    schedule 20.08.2012

Кажется, вы пытались где-то разыменовать нулевой указатель, попробуйте зайти в отладчик и посмотреть, где именно. Это может быть звонок .setGravity. Это будет означать, что Toast.makeText не удалось создать тост. Обратите внимание, что всплывающие уведомления можно создавать и отображать из действия или службы.

person Nikola Smiljanić    schedule 20.06.2010
comment
Я создаю тост внутри класса, который расширяет Activity в OnCLickListener void onClick - person Mervin; 20.06.2010
comment
Кажется, что я получаю сообщение об ошибке всякий раз, когда я вызываю Toast.show() вне метода onCreate(), хотя я на 1000% уверен, что Toast.show() не вызывается до того, как будет выполнено onCreate(). Как я могу это исправить? , я хочу показать всплывающее уведомление из пустоты onclick из прослушивателя onclicklistener, определенного в этом действии. - person Mervin; 20.06.2010

Оберните код в try-catch и проверьте трассировку стека в сгенерированном исключении. Похоже, что метод обратного вызова в Activity вызывается, когда вы этого не ожидаете.

person Richard Szalay    schedule 20.06.2010