Что отличает MainActivity.this от getApplicationContext()

Я пытаюсь ProgressDialog. Но я смущаюсь.

1. pd=ProgressDialog.show(MainActivity.this, "", "Fething data");

когда я использую (MainActivity.this), тогда это нормально. Но

2. pd=ProgressDialog.show(getApplicationContext(), "", "Fething data");

Когда я использую (getApplicationContext()), это ERROR.

Что такое проблема для этого прогресса? Диалог?

Чем отличается (MainActivity.this) vs (getApplicationContext())

и когда я использую это идеальное время?

Для getApplicationContext() Ошибка:

04-09 15:05:37.453: E/AndroidRuntime(9980): FATAL EXCEPTION: main
04-09 15:05:37.453: E/AndroidRuntime(9980): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.ViewRootImpl.setView(ViewRootImpl.java:571)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.Dialog.show(Dialog.java:281)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.ProgressDialog.show(ProgressDialog.java:116)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.ProgressDialog.show(ProgressDialog.java:99)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.ProgressDialog.show(ProgressDialog.java:94)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at com.example.shikkok_services.MainActivity$2.onClick(MainActivity.java:27)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.View.performClick(View.java:4204)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.View$PerformClick.run(View.java:17355)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.os.Handler.handleCallback(Handler.java:725)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.os.Looper.loop(Looper.java:137)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at java.lang.reflect.Method.invokeNative(Native Method)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at java.lang.reflect.Method.invoke(Method.java:511)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at dalvik.system.NativeStart.main(Native Method)

Ответ 1

Which context to use?

Существует два типа контекста:

Контекст приложения связан с приложением и всегда будет одинаковым на протяжении всего срока действия приложения; это не меняет. Поэтому, если вы используете Toast, вы можете использовать application context или даже activity context (оба), потому что Toast может отображаться в любом месте вашего приложения и не привязан к конкретному окну. Но есть много исключений. Одно из таких исключений - когда вам нужно использовать или передать activity context.

Контекст действия связан с действием и может быть уничтожен, если действие уничтожено; может быть несколько действий (более чем вероятно) с одним приложением. А иногда вам абсолютно необходим дескриптор контекста активности. Например, если вы запускаете новый Activity, вам необходимо использовать контекст действия в его Intent, чтобы вновь запущенное действие было связано с текущим действием с точки зрения стека действий. Однако вы также можете использовать контекст приложения для запуска нового действия, но затем вам нужно установить флаг Intent.FLAG_ACTIVITY_NEW_TASK, чтобы рассматривать его как новую задачу.

Давайте рассмотрим некоторые случаи:

MainActivity.this относится к контексту MainActivity, который расширяет класс Activity, но базовый класс (Activity) также расширяет класс Context, поэтому его можно использовать для предоставления контекста активности.

getBaseContext() предлагает контекст активности.

getApplication() предлагает контекст приложения.

getApplicationContext() также предлагает контекст приложения.

Для получения дополнительной информации, пожалуйста, проверьте эту ссылку.

Ответ 2

В этом объяснении, вероятно, отсутствуют некоторые тонкие нюансы, но оно должно дать вам лучшее понимание того, почему одно работает, а другое нет.

Разница в том, что MainActivity.this ссылается на текущую активность (context), тогда как getApplicationContext() ссылается на класс Application.

Важные различия между ними заключаются в том, что класс Application никогда не имеет каких-либо ассоциаций пользовательского интерфейса и поэтому не имеет маркера окна.

Короче говоря: для элементов пользовательского интерфейса, которые нуждаются в контексте, используйте Activity.

Ответ 3

  • MainActivity.this работает только в том случае, если вы находитесь во внутреннем классе MainActivity.

  • Если вы находитесь в MainActivity, просто используйте this.

  • Если вы полностью находитесь в another class, вам нужно передать его instance context из Activity, в котором вы находитесь.

Надеюсь, что это поможет.

Ответ 4

MainActivity.this относится к текущей активности (контексту), где getApplicationContext() относится к классу Application.

Метод getApplicationContext() возвращает контекст единого глобального объекта приложения текущего процесса. Обычно это нужно использовать только в том случае, если вам нужен контекст, жизненный цикл которого отделен от текущего контекста, привязанный к времени жизни процесса, а не к текущему компоненту.

MainActivity.this изменится, когда действие будет уничтожено и заново создано, getApplicationContext() изменится, когда приложение будет убито и перезапущено.

Ответ 5

Вот что говорит developer.android.com:

Возвращает контекст единого глобального объекта приложения текущего процесса. Обычно это нужно использовать только в том случае, если вам нужен контекст, жизненный цикл которого отделен от текущего контекста, привязанный к времени жизни процесса, а не к текущему компоненту.

В общем, используйте..Activity.this вместо getApplicationContext();

Дополнительная литература: developer.android.com/reference/android/content/Context.html#getApplicationContext()

Ответ 6

View.getContext(): возвращает контекст, в котором в настоящее время выполняется представление. Обычно текущая активная активность.

Activity.getApplicationContext(): возвращает контекст для всего приложения (процесс, в котором все действия запущены внутри). Используйте это вместо текущего контекста Activity, если вам нужен контекст, привязанный к жизненному циклу всего приложения, а не только текущая активность.

ContextWrapper.getBaseContext(): Если вам нужен доступ к Контексту из другого контекста, вы используете ContextWrapper. Контекст, на который ссылается изнутри, что ContextWrapper доступен через getBaseContext().

Ответ 7

mainActivity предоставляет контекст текущей активности. контекст зависит от жизненного цикла деятельности. getApplicationContext() предоставляет контекст приложения и зависит от жизненного цикла приложения.