Что отличает 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() предоставляет контекст приложения и зависит от жизненного цикла приложения.