MainActivity.this与getApplicationContext()之间有什么不同
我正在尝试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)
Which context to use?
有两种类型的上下文:
应用程序上下文与应用程序相关联,并且在应用程序的整个生命周期中始终保持不变 - 它不会更改。 因此,如果您使用Toast,则可以使用应用程序上下文甚至活动上下文(二者),因为吐司可以从应用程序中的任何地方显示,并且不会附加到特定的窗口。 但是有很多例外情况,例外情况是您需要使用或传递活动上下文。
活动上下文与活动相关联,并且可以在活动被销毁时被销毁 - 单个应用程序可能会有多个活动(比较可能)。 有时你绝对需要活动上下文句柄。 例如,如果您启动新活动,则需要在其Intent中使用活动上下文,以便新活动以活动堆栈的形式与当前活动相关联。 但是,您也可以使用应用程序的上下文来启动新的活动,但是您需要设置标志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,该生命周期与进程的生命周期相关,而不是当前组件。
当活动被销毁并重新创建时,MainActivity.this将会改变,getApplicationContext()将在应用程序终止并重新启动时改变。
链接地址: http://www.djcxy.com/p/24243.html上一篇: What is different between MainActivity.this vs getApplicationContext()
下一篇: Numeric edittext loses focus after first input in listview