【问题标题】:What is different between MainActivity.this vs getApplicationContext()MainActivity.this 与 getApplicationContext() 有什么不同
【发布时间】:2014-05-22 21:27:53
【问题描述】:

我正在尝试 ProgressDialog。但我很困惑。

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

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

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

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

这个progressDialog有什么问题?

(MainActivity.this) 与 (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)

【问题讨论】:

  • 错误说明了什么?

标签: android


【解决方案1】:

developer.android.com 是这么说的:

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

一般情况下,使用 ..Activity.this 代替 getApplicationContext();

延伸阅读:developer.android.com/reference/android/content/Context.html#getApplicationContext()

【讨论】:

  • 其实一般来说使用 getApplicationContext() 会更好,因为它不太可能导致内存泄漏。
【解决方案2】:

这个解释可能遗漏了一些细微的差别,但它应该让您更好地理解为什么一个有效而另一个无效。

不同之处在于MainActivity.this 指的是当前活动(context),而getApplicationContext() 指的是Application 类。

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

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

【讨论】:

  • thansk @triggs for answare.application 类是 MainACtivity 并且当前活动是 xml 布局??
  • 不,Application 类和 Activity 类都可以被认为是一种 Context。 Application 类可以被认为是整个应用程序,但 Activity 是当前屏幕上随时显示的内容,而 xml 布局只是 Activity 的 UI。
  • 你能定义什么是窗口令牌吗?
  • 它只是一个对 Window 的引用,它基本上是放置 ui 元素的地方。一个Activity有一个Window,所以可以放Views,ApplicationContext没有Window,所以没地方放Views。
【解决方案3】:

使用哪个上下文?

有两种类型的上下文:

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

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

让我们考虑一些情况:

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

getBaseContext() 提供活动上下文。

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

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

更多信息请查看link

【讨论】:

  • 感谢兄弟的回答...@Zohra khan,但我有些困惑,MainActvity 是 Applecation 而 Actvitiy 是上下文??
  • @user3515725 顾名思义,MainActivity 是活动,它是应用程序的一部分。应用程序中有各种组件,如服务、活动、广播接收器等。人。 MainActvity.this 是活动上下文。希望我清楚。请接受我的回答。
  • 您可以查看 androidhive.info 以了解有关 Android 的更多信息。
  • 这部分你的回答是错误的:“例如,如果你启动一个新的活动,你需要在它的 Intent 中使用活动上下文,以便新的启动活动连接到当前活动在活动堆栈方面。但是,您也可以使用应用程序的上下文来启动新活动,但是您需要设置标志 Intent.FLAG_ACTIVITY_NEW_TASK 以将其视为新任务。",@987654335用于调用startActivity() 的@ 是相关的,但是用作Intent 构造函数new Intent(context, Foo.class) 的第一个参数的Context 可以是任何Context
  • 如果你能修正你的答案以明确这一点,那将会很有用。很多人对此感到非常困惑。
【解决方案4】:

MainActivity.this 指的是当前活动(上下文),其中 getApplicationContext() 指的是 Application 类。

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

MainActivity.this 会在 Activity 销毁并重新创建时更改,getApplicationContext() 将在应用程序终止并重新启动时更改。

【讨论】:

    【解决方案5】:
    • MainActivity.this 仅适用于 MainActivity 的内部类。

    • 如果您在MainActivity 本身,只需使用this

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

    希望这有帮助..

    【讨论】:

      【解决方案6】:

      mainActivity 给出当前活动的上下文。 context 取决于活动的生命周期。 getApplicationContext() 给出了应用的上下文并且依赖于应用的生命周期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2015-12-13
        • 2013-05-16
        相关资源
        最近更新 更多