Android: ProgressDialog.show () аварийно завершает работу с getApplicationContext - PullRequest
108 голосов
/ 13 октября 2009

Я не могу понять, почему это происходит. Этот код:

mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);

работает просто отлично. Тем не менее, этот код:

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

выдает следующее исключение:

W/WindowManager(  569): Attempted to add window with non-application token WindowToken{438bee58 token=null}.  Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049):    at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049):    at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049):    ... 11 more

Есть идеи, почему это происходит? Я звоню из метода onCreate.

Ответы [ 18 ]

2 голосов
/ 02 марта 2014

(для будущих ссылок)

Я думаю, это потому, что существуют различия в контексте приложения и в контексте действия, как описано здесь: http://www.doubleencore.com/2013/06/context/

Это означает, что мы не можем показать диалог, используя контекст приложения. Вот и все.

2 голосов
/ 14 февраля 2013

Была похожая проблема с (совместимостью) фрагментов, в которых использование getActivity() в ProgressDialog.show() приводит к сбою. Я бы согласился, что это из-за времени.

Возможное исправление:

mContext = getApplicationContext();

if (mContext != null) {
    mProgressDialog = ProgressDialog.show(mContext, "", getString(R.string.loading), true);
}

вместо использования

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

Поместите mContext как можно раньше, чтобы у него было больше времени для захвата контекста. До сих пор нет гарантии, что это сработает, просто снижает вероятность сбоя. Если это все еще не работает, вам придется прибегнуть к взлому таймера (что может вызвать другие проблемы с синхронизацией, такие как закрытие диалога позже).

Конечно, если вы можете использовать this или ActivityName.this, это более стабильно, потому что this уже указывает на что-то. Но в некоторых случаях, например, с некоторыми архитектурами фрагментов, это не вариант.

1 голос
/ 20 июля 2016

Если вы вызываете ProgressDialog.show () во фрагменте, приведение mContext к Activity работало для меня.

     ProgressDialog pd = new ProgressDialog((Activity) mContext);
1 голос
/ 01 августа 2010

Чтобы обойти это, я создал базовый класс для всех моих действий, где я храню глобальные данные. В первом упражнении я сохранил контекст в переменной базового класса следующим образом:

Базовый класс

public static Context myucontext; 

Первое задание, полученное из базового класса

mycontext = this

Тогда я использую mycontext вместо getApplicationContext при создании диалогов.

AlertDialog alertDialog = new AlertDialog.Builder(mycontext).create();
0 голосов
/ 25 июня 2018

Это распространенная проблема. Используйте this вместо getApplicationContext() Это должно решить вашу проблему

0 голосов
/ 03 октября 2012

Диалог всегда создается и отображается как часть действия. Вам нужно передать контекст Activity вместо контекста приложения.

http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog

0 голосов
/ 03 февраля 2012

если у вас есть проблемы с groupActivity, не используйте это. PARENT - это статический элемент из родительской группы действий.

final AlertDialog.Builder builder = new AlertDialog.Builder(GroupActivityParent.PARENT);

вместо

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());
0 голосов
/ 22 июня 2010

Я реализовал Alert Dialog для выдачи исключений в текущем представлении активностей. Когда бы я ни давал подобное

AlertDialog.Builder builder = new AlertDialog.Builder(context);

Принимая во внимание то же Window Exception. Я пишу код для предупреждения из onCreate (). Так просто я использовал context = this; после setContentView() оператора в onCreate() method.Taken переменную контекста как глобальную, такую ​​как Context context;

Пример кода

static Context context;

 public void onCreate(Bundle savedInstanceState)  { 
        super.onCreate(savedInstanceState); 


        setContentView(R.layout.network); 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        context = this;
.......

Пример метода оповещения:

private void alertException(String execMsg){
        Log.i(TAG,"in alertException()..."+context);
        Log.e(TAG,"Exception :"+execMsg);
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
.......

Это прекрасно работает для меня. На самом деле я искал эту ошибку в StackOverflow и нашел этот запрос. После прочтения всех ответов на этот пост я попробовал этот способ, чтобы он работал. Я подумал, что это простое решение для преодоления исключения.

Спасибо, Rajendar

...