MainActivity.this与getApplicationContext()之间有什么不同

我正在尝试ProgressDialog.But我很迷惑。

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

当我使用(MainActivity.this),那么它是好的。 但

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

当我使用(getApplicationContext())它是错误的。

这个进度对话框有什么问题?

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) 

Solutions Collecting From Web of "MainActivity.this与getApplicationContext()之间有什么不同"

 Which context to use? 

有两种types的上下文:

应用程序上下文与应用程序相关联,并且在应用程序的整个生命周期中始终保持不变 – 它不会改变。 所以,如果您使用Toast,则可以使用应用程序上下文甚至活动上下文(二者),因为可以从应用程序中的任何位置显示Toast,并且不会连接到特定的窗口。 但是有很多例外情况,例外情况是您需要使用或传递活动上下文。

活动上下文活动相关联,如果活动被破坏, 活动上下文可能会被销毁 – 单个应用程序可能会有多个活动(比较可能)。 有时你绝对需要活动上下文句柄。 例如,如果您启动新的活动,则需要在其Intent中使用活动上下文,以便新的启动活动以活动堆栈的forms与当前活动相关联。 但是,您也可以使用应用程序的上下文来启动新的活动,但是您需要设置标志Intent.FLAG_ACTIVITY_NEW_TASK以将其视为新任务。

我们来考虑一些情况:

MainActivity.this指的是扩展Activity类的MainActivity上下文,而基类(activity)也扩展了Context类,所以它可以用来提供活动上下文。

getBaseContext()提供活动上下文。

getApplication()提供应用程序上下文。

getApplicationContext()也提供了应用程序上下文。

欲了解更多信息,请查看此链接 。

这个解释可能会遗漏一些微妙的细微差别,但它应该让你更好地理解为什么一个工作,但另一个不工作。

不同之处在于,MainActivity.this引用了当前活动(上下文),因为getApplicationContext()引用了Application类。

2之间的重要区别在于Application类从来没有任何UI关联,因此没有窗口标记。

长话短说:对于需要上下文的UI项目,使用“活动”。

MainActivity.this引用当前活动(上下文),其中getApplicationContext()引用Application类。

getApplicationContext()方法返回当前进程的单个全局应用程序对象的上下文。 这通常只应用于需要生命周期与当前上下文分离的Context的情况,该上下文与进程的生命周期相关,而不是当前组件。

当活动被销毁并重新创build时,MainActivity.this将会改变,getApplicationContext()将会在应用程序终止并重新启动时改变。

  • MainActivity.this仅适用于MainActivity的内部类。

  • 如果你在MainActivity本身,只要使用this

  • 如果您完全在another class ,则需要从您所在的Activity传递一个contextinstance

希望这可以帮助..

这就是developer.android.com所说的:

返回当前进程的单个全局应用程序对象的上下文。 这通常只应用于需要生命周期与当前上下文分离的Context的情况,该上下文与进程的生命周期相关,而不是当前组件。

一般来说,使用..Activity.this而不是getApplicationContext();

进一步阅读: developer.android.com/reference/android/content/Context.html#getApplicationContext()

View.getContext():返回视图当前正在运行的上下文。通常是当前活动的Activity。

Activity.getApplicationContext():返回整个应用程序的上下文(进程中所有的活动都在里面运行)。 如果您需要一个与整个应用程序的生命周期相关的上下文,而不仅仅是当前的Activity,那么使用它而不是当前的Activity上下文。

ContextWrapper.getBaseContext():如果需要从另一个上下文中访问Context,则使用ContextWrapper。 从ContextWrapper引用的Context是通过getBaseContext()来访问的。