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

时间:2014-04-09 15:03:11

标签: android

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

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

当我使用(MainActivity.this)时,就可以了。但

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

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

这个progressDialog有什么问题?

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)

7 个答案:

答案 0 :(得分:75)

Which context to use?

有两种类型的上下文:

应用程序上下文与应用程序相关联,并且在应用程序的整个生命周期中始终保持相同 - 它不会更改。因此,如果您正在使用Toast,则可以使用应用程序上下文甚至活动上下文(两者),因为toast可以在应用程序中的任何位置显示,并且不会附加到特定窗口。但是有很多例外,一个例外是当你需要使用或传递活动上下文时。

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

让我们考虑一些案例:

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

getBaseContext()提供活动上下文。

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

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

有关详情,请查看此link

答案 1 :(得分:12)

这种解释可能缺少一些微妙的细微差别,但它应该让你更好地理解为什么一个有效但另一个没有。

区别在于MainActivity.this表示当前活动(context),而getApplicationContext()表示Application类。

两者之间的重要区别在于Application类从不具有任何UI关联,因此没有窗口令牌。

长话短说:对于需要上下文的UI项目,请使用Activity。

答案 2 :(得分:9)

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

  • 如果您自己在MainActivity,请使用this

  • 如果您完全在another class,则需要从instancecontext Activity传递yield

希望这会有所帮助..

答案 3 :(得分:6)

MainActivity.this是指getApplicationContext()引用Application类的当前活动(上下文)。

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

MainActivity.this会在活动被破坏和重新创建时发生变化,当应用程序被杀死并重新启动时,getApplicationContext()会发生变化。

答案 4 :(得分:0)

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

  

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

通常,使用..Activity.this而不是getApplicationContext();

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

答案 5 :(得分:0)

mainActivity给出当前活动的上下文。上下文取决于活动生命周期。 getApplicationContext()给出应用程序的上下文,并取决于应用程序的生命周期。

答案 6 :(得分:0)

不要使用

<块引用>

getApplicationContext()

在需要当前类像 AlertDialog 一样位于前面的组件中